gpt4 book ai didi

c++ - 将智能指针传递给函数(接受 void*)而不调用指针的析构函数

转载 作者:行者123 更新时间:2023-11-30 03:10:21 24 4
gpt4 key购买 nike

我有自己的智能指针实现,它使用引用计数作为所有权机制(注意:我已经测试过它并且没有错误)。

以下是我的代码流程。

  1. 创建对象并创建指向对象的智能指针
  2. 调用具有以下定义的函数:void Func(void* param)(注意:此函数在不同的线程上下文中运行)。
  3. 但是,当 Func 被调用时,问题出现了,下面的事情发生了

    • 在参数评估中:它使用复制构造函数创建另一个智能指针
    • 两个智能指针都有相同的指针,指针的引用计数为 2。
    • 在调用函数之前,第二个智能指针被释放并且引用计数变为 1
    • 现在,主线程也结束了,Func 线程正在运行
    • 当主线程结束时,它会销毁指针,因为引用计数为 0。
    • 因此,Func 出现段错误!!!

请告诉我,这样做有什么技巧吗? (变通办法也行。)

谢谢


这是上述内容的示例代码。
(AutoRef 是实现了引用计数的智能指针)。

主线程

AutoRef<MyClass> system(new MyClass);  
CreateThread(..., Func, &AutoRef<MyClass>(system)); // In param evaluation step 3 happens

其他线程

// Function code  
//
void Func(void* param)
{
// Following line does not invoke copy constructor
// (which is fine as per usage of reinterprete_cast)
AutoRef<MyClass>* system = reinterpret_cast<AutoRef<MyClass>*>(param);
...
...
...
}

最佳答案

智能指针意味着引用的对象在最后一个智能指针被销毁后立即被删除,因此您的代码中发生的事情符合预期。您需要从智能指针实例中释放指针,将所有权转移给 Func。

关于c++ - 将智能指针传递给函数(接受 void*)而不调用指针的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3320973/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com