【发布时间】:2011-03-20 06:09:30
【问题描述】:
我有自己的智能指针实现,它使用引用计数作为所有权机制(注意:我已经对其进行了测试,它没有错误)。
以下是我的代码流程。
- 创建对象并创建指向对象的智能指针
- 调用函数,定义如下:
void Func(void* param)(注意:此函数在不同的线程上下文中运行)。 -
但是,当 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