【问题标题】:Passing smart pointer to the function (which acccepts void*) without calling destructor of pointee将智能指针传递给函数(接受 void*)而不调用指针的析构函数
【发布时间】:2011-03-20 06:09:30
【问题描述】:

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

以下是我的代码流程。

  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 时是如何制作副本的,因为它无论如何都不能接受智能指针。此外,您不应该让main 完成,直到Func 完成,或者杀死它。最后,你的智能指针做得很好,但要小心提升有shared_ptr
  • 编辑问题描述

标签: c++ smart-pointers


【解决方案1】:

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

【讨论】:

  • 当函数有原型 void* 作为参数时,如何将所有权转移给函数。
  • 取决于智能指针的具体类型,但通常有一个名为release 的函数,它不仅返回一个指针,而且确保实例不再将其作为析构函数的一部分删除。然后将这个无主的返回值作为参数传递给 void* 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2021-07-22
  • 2013-06-25
  • 2018-08-25
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多