【发布时间】:2015-10-04 00:15:47
【问题描述】:
我试图一个接一个地破坏 shared_ptr,但是当我破坏最后一个指针时, use_count() 变得疯狂。观察我的代码:
#include <iostream>
#include <memory>
int main() {
int * val = new int(5);
std::shared_ptr<int> myPtr = std::make_shared<int>(*val);
myPtr.~__shared_ptr();
}
将在调试器中产生以下输出:
myPtr value: 5 myPtr.use_count():8787448 // Or some other large int
我希望在最终销毁时它将 use_count() 设置为 0 并为整数释放内存。看来这一切都没有发生。
当 use_count() == 1 时,我可以 if() 声明这个,但这似乎很不优雅。有谁知道另一种解决方案?
【问题讨论】:
-
你在这里所做的一切都是危险的。
-
如果你想知道指向的对象是否已经被释放,那么只需使用析构函数打印消息的类。你现在手动调用指针的析构函数然后访问它很可能是 UB。
-
您所看到的并不能证明内存仍然被分配。您可能(并且可能正在)访问已释放的内存并读取其中发生的任何内容,这可能是
int留下的字节,尚未重新使用。 -
为什么不让它超出范围并通过第二个
shared_ptr检查它的计数? -
您为
val中的整数分配的内存在您的示例中泄漏。它不是由共享指针管理的。
标签: c++ pointers shared-ptr smart-pointers explicit-destructor-call