shared_ptr的机制

Shi*_*ang 0 c++ pointers 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;
}
Run Code Online (Sandbox Code Playgroud)

有没有人可以告诉我为什么地址已被释放?
我没有操纵原始整数指针"aptr",但由于shared_ptr,不知何故它的空间已经消失了?
我想知道它是怎么发生的,谢谢大家!

Sam*_*hik 7

其背后的全部目的std::shared_ptr是获取动态分配对象的所有权.一旦std::shared_ptr获得动态分配对象的所有权,通过std::make_shared或通过直接指定它,std::shared_ptr拥有它,锁定股票和桶.拥有它意味着delete当对动态范围对象的最后一次引用超出范围时自动运行动态范围对象.这就是shared_ptr它的用途,而不是别的.

a = NULL;
Run Code Online (Sandbox Code Playgroud)

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

你仍然拥有原始的本机指针的事实int是无关紧要的.shared_ptr不在乎.整件事情得到了解决delete.

如果您不想shared_ptr使用delete任何内容new,并使用本机指针,请不要使用shared_ptr,或者确保只要您仍然需要使用指向底层对象的本机指针.

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