shared_ptr的机制

The mechanism of shared_ptr

我无意中在 C++ 上发现了这个问题,但完全不知道它是怎么发生的,请查看下面的代码片段:

    int main() {
        int *aptr = new int(20); //Declare an integer space with 20, and aptr points to it
        shared_ptr<int> a(aptr); //Declare a shared_ptr to points where aptr points

        stringstream ss;
        ss << a;
        const char *chstr = ss.str().c_str();  // Save the address as string

        void *address;
        sscanf(chstr, "%p", (void **)&address); // Convert string back to pointer

        a = NULL;  // Free the shared pointer   
        cout << *reinterpret_cast<int*>(address) << endl; // Output: 0, 20 has gone

        return 0;
}

有没有人能告诉我为什么地址被释放了?
我没有操作原始整数指针 "aptr",但由于 shared_ptr ?
,它的 space 不知何故消失了 想知道是怎么回事,谢谢大家!

此代码无法在 g++ 4.2.1 中编译(但如 Sam 所述,它符合版本 6):

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp 
main.cpp:17:11: error: no viable overloaded '='
        a = NULL;  // Free the shared pointer   
        ~ ^ ~~~~

顺便说一下,你应该使用 shared_ptr::reset:

In all other cases, the shared_ptr acquires ownership of p with a use count of 1, and -optionally- with del and/or alloc as deleter and allocator, respectively.

Additionally, a call to this function has the same side effects as if shared_ptr's destructor was called before its value changed (including the deletion of the managed object if this shared_ptr was unique).


同时勾选 string::c_str。您正在保存一个临时字符串的地址,这是不好的开始。

std::shared_ptr 背后的全部目的是取得动态分配对象的所有权。一旦 std::shared_ptr 通过 std::make_shared 或直接分配指向它的指针获得动态分配对象的所有权,std::shared_ptr 就拥有它,锁定库存和桶。拥有它意味着当对动态范围对象的最后一次引用超出范围时自动 deleteing 动态范围对象。这就是 shared_ptr 的用途,仅此而已。

a = NULL;

这使用了 shared_ptr 的赋值运算符来替换 shared_ptr 拥有的指针 (*)。由于 shared_ptr 拥有的原始动态范围对象没有其他引用,因此 shared_ptr delete 是用于构造它的原始指针。

您仍然拥有指向 int 的原始本机指针这一事实无关紧要。 shared_ptr 不在乎。整个事情变得 deleted.

如果您不希望 shared_ptrdelete 无论您 new 编辑什么,并且使用本机指针,要么不要使用 shared_ptr,要么只要您仍然需要使用指向底层对象的本机指针,请确保它仍然存在。

(*) 这实际上隐式构造了另一个 shared_ptr,并使用了常规赋值运算符。