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
就拥有它,锁定库存和桶。拥有它意味着当对动态范围对象的最后一次引用超出范围时自动 delete
ing 动态范围对象。这就是 shared_ptr
的用途,仅此而已。
a = NULL;
这使用了 shared_ptr
的赋值运算符来替换 shared_ptr
拥有的指针 (*)。由于 shared_ptr
拥有的原始动态范围对象没有其他引用,因此 shared_ptr
delete
是用于构造它的原始指针。
您仍然拥有指向 int
的原始本机指针这一事实无关紧要。 shared_ptr
不在乎。整个事情变得 delete
d.
如果您不希望 shared_ptr
到 delete
无论您 new
编辑什么,并且使用本机指针,要么不要使用 shared_ptr
,要么只要您仍然需要使用指向底层对象的本机指针,请确保它仍然存在。
(*) 这实际上隐式构造了另一个 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
就拥有它,锁定库存和桶。拥有它意味着当对动态范围对象的最后一次引用超出范围时自动 delete
ing 动态范围对象。这就是 shared_ptr
的用途,仅此而已。
a = NULL;
这使用了 shared_ptr
的赋值运算符来替换 shared_ptr
拥有的指针 (*)。由于 shared_ptr
拥有的原始动态范围对象没有其他引用,因此 shared_ptr
delete
是用于构造它的原始指针。
您仍然拥有指向 int
的原始本机指针这一事实无关紧要。 shared_ptr
不在乎。整个事情变得 delete
d.
如果您不希望 shared_ptr
到 delete
无论您 new
编辑什么,并且使用本机指针,要么不要使用 shared_ptr
,要么只要您仍然需要使用指向底层对象的本机指针,请确保它仍然存在。
(*) 这实际上隐式构造了另一个 shared_ptr
,并使用了常规赋值运算符。