首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于智能指针shared_ptr的疑点

2013-03-01 
关于智能指针shared_ptr的疑问第一个问题:如果在一个线程A中有shared_ptrDWIRD dword1线程B中持有dword

关于智能指针shared_ptr的疑问
第一个问题:

如果在一个线程A中有shared_ptr<DWIRD> dword1;
线程B中持有dword1的引用
shared_ptr<DWIRD> *dword2 = &dword1;
或者是shared_ptr<DWIRD> &dword3 = dword1;

那么对于dword2跟dword3来说 不就起不到智能释放的作用了么
并且如果dword1在线程A中的生存周期结束时
B中的dword2跟dword3要怎么判断这个对象有没有释放呢?


第二个问题:
DWORD *p = new DWORD;
线程A中有shared_ptr<DWIRD> dword1(p);
线程B中也有shared_ptr<DWIRD> dword2(p);
因为可能A跟B互不知道对方有没有创建p的shared_ptr
或者说两个模块,分别是两个程序员来开发的,他们不知道对方创建了shared_ptr
此时一样起不到智能释放的作用,并且还会重复释放。


那么对于这种共享型的智能指针
感觉并不能保证一个对象能在合适的时机被安全的释放
或者说智能指针这种设计并不是真的很安全

大家是怎么理解的呢?或者平时又是怎么来安全的使用的






当然,如果你使用错误,就有可能SAFE_DELETE(p)两次
[解决办法]
弱弱一问, 你是怎么把原始指针传递给 2个线程的?

[解决办法]
贴出实际编译通过的代码来再问吧……
[解决办法]
关于智能指针shared_ptr的疑点

这个应该遵循:指针谁创建谁管理的原则啊~

p指针释放,应该交给stlmap清理时做啊~~

线程只是使用者,不应该去释放p指针关于智能指针shared_ptr的疑点
这里又拿p去初始化智能指针,在下感觉多余了。
[解决办法]
你清理stlmap的时机是什么时候?

若stlmap 创建在主线程,那么主线不是应该等待 子线程结束,然后 才去清理stlmap吗?

若子线程中途Abort,那必然可能会造成一些内存问题了。
[解决办法]

引用:
引用:这个应该遵循:指针谁创建谁管理的原则啊~

p指针释放,应该交给stlmap清理时做啊~~

线程只是使用者,不应该去释放p指针
这里又拿p去初始化智能指针,在下感觉多余了。

那么现在就是 由于两个线程都持有p
stlmap他不知道p还有没有在被其他线程使用
因此不能确定p的正确的删除时机

所以才希望由……
map里放智能指针啊
[解决办法]
shared_ptr的作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。这在非环形数据结构中防止资源泄露很有帮助。
auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。

摘自百度百科

热点排行