【发布时间】:2022-01-17 02:19:54
【问题描述】:
假设我有一个具有以下定义的 A 类:
class A {
A(std::string& s) : text_(s) {}
private:
std::string& text;
}
请注意,A 包含对字符串对象的引用。这可能是因为我们不想复制或移动对象。
现在,如果我有以下代码
std::string text = "......";
std::unique_ptr<A>(new A(text));
// now I destroy text in some way, either explicitly call the deconstructor or it goes out of scope somehow
问题是unique_ptr的对象A现在会发生什么? A 包含对已删除的对象文本的引用。 unique_ptr 的 A 现在有一个悬空指针吗?还是 unique_ptr 处理这种情况并延长它包含原始指针的对象的生命周期?
【问题讨论】:
-
我猜你的背景是比 C++ 更高级的语言
-
std::unique_ptr<A>(A(text);缺少一堆字符,这不是您初始化唯一指针的方式。 -
你不是在删除字符串,而是在销毁它,当它稍后再次自动销毁时会造成很大的悲痛。就像你有
std::string text; text.~string();一样可怕 -
调用
text的析构函数显式地从代码的其余部分中拉出地毯。unique_ptr在这里并不重要。A对象中的引用不再有效,因此对它的任何使用都会导致未定义的行为。当text的析构函数在其作用域的末尾自动运行时,结果充其量是不可预测的。不要那样做。 -
请让示例正常运行。一般来说,如果你做你想做的事情,你将被双重删除。见stackoverflow.com/questions/9169774/…