在堆栈上分配std::string
(自动存储持续时间)并分配给指针。然后指针将被设置为null。
std::string* myString = &std::string("");
myString = nullptr;
在第二条指令之后立即释放myString
,或者只有在函数返回后,如果它是对象被销毁后的成员,则它才会被分别释放。
答案 0 :(得分:2)
您无法将string
指定给指针。但是,您可以将string
的地址指定为string
指针。让我将您的代码更改为有效的C ++:
std::string s = "";
std::string* s_ptr = &s;
s_ptr = nullptr;
您更改指向s
的指针值的事实根本不会影响字符串。想象一下,你在一张纸上写下朋友家的地址。当你擦掉那张纸上的地址时房子会被毁坏吗?幸运的是没有。
delete s_ptr
,这在那里是错误的case,因为指针指向的字符串不是通过new
创建的。幸运的是,这在现实生活中不起作用;)
答案 1 :(得分:0)
myString
本身无法在任何地方“解除分配”,因为它从未被分配过。 myString
已在自动范围内实例化。
当声明myString
的范围终止时,myString
超出范围并被销毁。如果在函数的顶级作用域中声明了myString
,则在函数返回时会发生这种情况。在其范围终止之前,myString
本身仍然是指针的有效实例。
第一个语句将myString
设置为指向立即销毁的临时对象。语句本身是有效的,但从该点开始取消引用指针将导致未定义的行为。下一个语句将指针设置为nullptr
,因此不会发生任何未定义的行为。