【问题标题】:How does std::unique_ptr handle raw pointers/references in a class?std::unique_ptr 如何处理类中的原始指针/引用?
【发布时间】: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&lt;A&gt;(A(text); 缺少一堆字符,这不是您初始化唯一指针的方式。
  • 你不是在删除字符串,而是在销毁它,当它稍后再次自动销毁时会造成很大的悲痛。就像你有std::string text; text.~string();一样可怕
  • 调用text 的析构函数显式地从代码的其余部分中拉出地毯。 unique_ptr 在这里并不重要。 A 对象中的引用不再有效,因此对它的任何使用都会导致未定义的行为。当text 的析构函数在其作用域的末尾自动运行时,结果充其量是不可预测的。不要那样做。
  • 请让示例正常运行。一般来说,如果你做你想做的事情,你将被双重删除。见stackoverflow.com/questions/9169774/…

标签: c++ c++11


【解决方案1】:

C++ 不是一种安全的语言。如果您有一个指向已销毁对象的指针或引用,则使用该指针或引用是一个错误。

假设您实际上构造了一个比text 寿命更长的A,它仍然会引用被销毁的对象,并且对该成员的任何使用都是未定义的行为。

【讨论】:

    猜你喜欢
    • 2019-07-28
    • 2013-08-18
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多