共享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; } intmain(){ int*aptr=newint(20);//声明一个带20的整数空间,aptr指向它 shared_ptr a(aptr);//向aptr指向的点声明共享的_ptr 细流ss; ss

共享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; } intmain(){ int*aptr=newint(20);//声明一个带20的整数空间,aptr指向它 shared_ptr a(aptr);//向aptr指向的点声明共享的_ptr 细流ss; ss,c++,pointers,shared-ptr,C++,Pointers,Shared Ptr,此代码不在g++4.2.1中编译(但正如Sam所述,它符合版本6): 顺便说一下,您应该使用: 在所有其他情况下,共享的ptr通过使用获得p的所有权 计数为1,并且(可选)使用del和/或alloc作为删除器和 分配器 此外,调用此函数的副作用与 shared_ptr的析构函数在其值更改之前被调用(包括 如果此共享\u ptr是唯一的,则删除托管对象) 还要检查。您正在保存一个临时字符串的地址,这是一些不好的开始。std::shared_ptr背后的全部目的是获取动态分配对象的所有权。一旦st

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

顺便说一下,您应该使用:

在所有其他情况下,共享的ptr通过使用获得p的所有权 计数为1,并且(可选)使用del和/或alloc作为删除器和 分配器

此外,调用此函数的副作用与 shared_ptr的析构函数在其值更改之前被调用(包括 如果此共享\u ptr是唯一的,则删除托管对象)



还要检查。您正在保存一个临时字符串的地址,这是一些不好的开始。

std::shared_ptr背后的全部目的是获取动态分配对象的所有权。一旦
std::shared_ptr
通过
std::make_shared
或通过直接给它分配一个指针,
std::shared_ptr
拥有它,锁定库存。拥有它意味着当对动态范围对象的最后一个引用超出范围时自动
删除
动态范围对象。这就是
共享_ptr
的用途,没有其他用途

a = NULL;
这使用了
shared\u ptr
的赋值运算符来替换
shared\u ptr
拥有的指针(*)。由于
shared\u ptr
拥有的原始动态范围对象没有其他引用,因此
shared\u ptr
删除了用于构造它的原始指针

您仍然拥有指向
int
的原始本机指针这一事实是无关紧要的。
shared\u ptr
并不重要。整个过程都是
delete
d

如果您不想
shared_ptr
删除
new
ed中的任何内容,并使用本机指针,则不要使用
shared_ptr
,或者只要您仍然需要使用指向底层对象的本机指针,就确保有一个指针仍然存在


(*)这实际上隐式构造了另一个
共享的\u ptr
,并使用了常规赋值运算符。

好吧。你在腿上开枪,然后问“为什么发生了错误”第一:保存临时字符串的地址,这很糟糕。第二:将NULL分配给shared_ptr,而不是调用reset。我不知道你想实现什么,也不知道你真正想问什么。我认为你需要更好地理解指针和它们指向的东西之间的区别;nullpointer@DanAllen好,但是保存了
str().c_str()
str()
返回temporary
string
@永远是我的错误。你是对的。修改是对临时文件的破坏。使用gcc 6.3.1Thank@SamVarshavchik编译很好,回答很好!非常感谢,它帮助了我很多,非常详细,非常清楚。我想问的另一个问题是,这是在Android::sp中发生的吗(强指针)也是吗?
a = NULL;