存储在堆栈上的Integer的释放没有任何关联的指针或变量

时间:2016-09-18 11:24:39

标签: c++ pointers memory-management stack null-pointer

在堆栈上分配std::string(自动存储持续时间)并分配给指针。然后指针将被设置为null。

std::string* myString = &std::string("");
myString = nullptr;

在第二条指令之后立即释放myString,或者只有在函数返回后,如果它是对象被销毁后的成员,则它才会被分别释放。

2 个答案:

答案 0 :(得分:2)

您无法将string指定给指针。但是,您可以将string的地址指定为string指针。让我将您的代码更改为有效的C ++:

std::string s = "";
std::string* s_ptr = &s;
s_ptr = nullptr;

您更改指向s的指针值的事实根本不会影响字符串。想象一下,你在一张纸上写下朋友家的地址。当你擦掉那张纸上的地址时房子会被毁坏吗?幸运的是没有。

PS:嗯,这个类比的限制是在C ++中你可以使用“那张纸”然后说“在这个地址摧毁房子”(又名delete s_ptr,这在那里是错误的case,因为指针指向的字符串不是通过new创建的。幸运的是,这在现实生活中不起作用;)

答案 1 :(得分:0)

myString本身无法在任何地方“解除分配”,因为它从未被分配过。 myString已在自动范围内实例化。

当声明myString的范围终止时,myString超出范围并被销毁。如果在函数的顶级作用域中声明了myString,则在函数返回时会发生这种情况。在其范围终止之前,myString本身仍然是指针的有效实例。

第一个语句将myString设置为指向立即销毁的临时对象。语句本身是有效的,但从该点开始取消引用指针将导致未定义的行为。下一个语句将指针设置为nullptr,因此不会发生任何未定义的行为。