C++11 指向堆栈内存的指针 类对象 { 公众: 对象(){} ~object(){} }; int main() { object*p=NULL; { 对象a; p=&a; 如果(p){ cout
当C++11 指向堆栈内存的指针 类对象 { 公众: 对象(){} ~object(){} }; int main() { object*p=NULL; { 对象a; p=&a; 如果(p){ cout,c++11,pointers,heap-memory,stack-memory,C++11,Pointers,Heap Memory,Stack Memory,当a被销毁时,p将成为一个悬空指针。它是一个不为空的指针,但仍有未定义的行为来取消引用它 这是因为一个正在消亡的对象不会开始在程序中的任何地方更改值。如果程序中的任何地方都有一百个指向正在消亡的对象的指针,会发生什么情况?你不能只是神奇地将它们的所有值更改为nullptr。如果你想让这些指针变成nullptr,你必须影响它们重视自己。p一旦a超出范围,就不会神奇地将自己设置为nullptr。C++的可能副本提供了强大的功能,但却牺牲了巨大的责任。不要做愚蠢的事情。如果你这样做,不要期望逻辑结果。
a
被销毁时,p
将成为一个悬空指针。它是一个不为空的指针,但仍有未定义的行为来取消引用它
这是因为一个正在消亡的对象不会开始在程序中的任何地方更改值。如果程序中的任何地方都有一百个指向正在消亡的对象的指针,会发生什么情况?你不能只是神奇地将它们的所有值更改为
nullptr
。如果你想让这些指针变成nullptr
,你必须影响它们重视自己。p
一旦a
超出范围,就不会神奇地将自己设置为nullptr
。C++的可能副本提供了强大的功能,但却牺牲了巨大的责任。不要做愚蠢的事情。如果你这样做,不要期望逻辑结果。
class object
{
public:
object(){}
~object(){}
};
int main()
{
object *p = NULL;
{
object a;
p = &a;
if(p){
cout << "not NULL\n";
}
else{
cout << "NULL ptr\n";
}
}
if(p){
cout << "not NULL\n";
}
else{
cout << "NULL ptr\n";
}
return 1;
}