- 主题:刚刚明白了有些引用计数指针的做法
shared_ptr可以用shared_ptr<T>(T_ *rawptr)构造,但是由于它的引用信息是在shared_ptr对象里的,如果有两个shared_ptr用同一个裸指针构造,那么最后析构的时候,就会发生那个裸指针重复释放的错误。
我现在看的一个项目自己做了一个引用计数指针,它是做了一个RefCounted trait,它自己做引用计数,需要用引用计数指针的类需要继承RefCounted,于是用RefCountingPtr<T>(T_ *rawptr)构造的时候,rawptr指向的对象内部的计数器也可以自增,从而允许在不同的位置用同一个裸指针构造引用计数指针。我现在在程序里的一个位置只能拿到一个this指针,可以从它重新构造一个对应的引用计数指针。
--
FROM 103.254.68.*
"如果有两个shared_ptr用同一个裸指针构造"
有什么需求需要这样做么?
【 在 ArchLinux 的大作中提到: 】
: shared_ptr可以用shared_ptr<T>(T_ *rawptr)构造,但是由于它的引用信息是在shared_ptr对象里的,如果有两个shared_ptr用同一个裸指针构造,那么最后析构的时候,就会发生那个裸指针重复释放的错误。
: 我现在看的一个项目自己做了一个引用计数指针,它是做了一个RefCounted trait,它自己做引用计数,需要用引用计数指针的类需要继承RefCounted,于是用RefCountingPtr<T>(T_ *rawptr)构造的时候,rawptr指向的对象内部的计数器也可以自增,从而允许在不同的位置用同一个裸指针构造引用计数指针。我现在在程序里的一个位置只能拿到一个this指针,可以从它重新构造一个对应的引用计数指针。
--
FROM 63.128.6.*
你说的是 QEnableSharedFromThis 和 std::enable_shared_from_this ?
【 在 ArchLinux (a lightweight and flexible distribution) 的大作中提到: 】
: shared_ptr可以用shared_ptr<T>(T_ *rawptr)构造,但是由于它的引用信息是在shared_ptr对象里的,如果有两个shared_ptr用同一个裸指针构造,那么最后析构的时候,就会发生那个裸指针重复释放的错误。
: 我现在看的一个项目自己做了一个引用计数指针,它是做了一个RefCounted trait,它自己做引用计数,需要用引用计数指针的类需要继承RefCounted,于是用RefCountingPtr<T>(T_ *rawptr)构造的时候,rawptr指向的对象内部的计数器也可以自增,从而允许在不同的位置用同一个
--
FROM 112.47.93.*
我使用了一个对象的方法,这时候只有对象的裸指针this,我要把这个对象给一段时间后的另一个函数使用,在这段时间内这个对象可能会因为不再被引用而被析构,所以我希望用一个共享指针引用这个this指针。而我做的这个项目里面恰好这个对象的类就是RefCounted的子类,所以可以从this构造出一个引用计数指针。
【 在 Bernstein (Berns) 的大作中提到: 】
: "如果有两个shared_ptr用同一个裸指针构造"
: 有什么需求需要这样做么?
--
FROM 103.254.68.*
看起来有点像,同样都需要指向的类继承一个这样的类。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 你说的是 QEnableSharedFromThis 和 std::enable_shared_from_this ?
--
修改:ArchLinux FROM 103.254.68.*
FROM 103.254.68.*
重新发明了COM 1995年之前就已经发明的做法…
【 在 ArchLinux () 的大作中提到: 】
: shared_ptr可以用shared_ptr<T>(T_ *rawptr)构造,但是由于它的引用信息是在shared_ptr对象里的,如果有两个shared_ptr用同一个裸指针构造,那么最后析构的时候,就会发生那个裸指针重复释放的错误。
: 我现在看的一个项目自己做了一个引用计数指针,它是做了一个RefCounted trait,它自己做引用计数,需要用引用计数指针的类需要继承RefCounted,于是用RefCountingPtr<T>(T_ *rawptr)构造的时候,rawptr指向的对象内部的计数器也可以自增,从而允许在不同的位置用同一个裸指针构造引用计数指针。我现在在程序里的一个位置只能拿到一个this指针,可以从它重新构造一个对应的引用计数指针。
--
FROM 138.19.103.*