【问题标题】:Class initialised inside another class, how does it survive?在另一个类中初始化的类,它如何生存?
【发布时间】:2012-12-02 19:21:17
【问题描述】:

所以我有一个名为 List 的类,它存储指向 Object 类型的类的指针向量。 List 有一个名为 add 的函数,它初始化一个 Object 类并将它的指针添加到向量。我认为一旦 add 函数结束,Object 类将被破坏并且访问指针会导致异常。当我编写了一个测试程序来测试它时,发现 Object 类从未被销毁。

函数内部初始化的类是否会在函数结束后销毁?

类什么时候自动销毁?

【问题讨论】:

  • 类永远不会被销毁;对象是。何时/如何销毁对象取决于它们是如何创建的。你是如何创建你的对象的?

标签: c++ class


【解决方案1】:

取决于您如何创建对象。如果你这样做:

void add() {
  Object obj;
  vec.push_back(&obj);
}

那么您正在创建obj 并具有自动存储持续时间。这意味着它将在add 函数结束时被销毁。您推入向量中的指针将不再指向有效的Object,所以绝对不要这样做。

但是,您可能会这样做:

void add() {
  Object* obj = new Object();
  vec.push_back(obj);
}

如果是,您正在创建具有动态存储持续时间Object,并且它不会在函数结束时被销毁。您推入向量的指针将保持有效。但是,如果您这样做,您需要稍后记住delete 对象。如果不这样做,就会泄漏。

如果可以的话,最好的选择是完全避免使用指针。只需将向量设为 std::vector<Object> 并将对象复制到其中即可:

void add() {
  vec.push_back(Object());
}

或者在 C++11 中:

void add() {
  vec.emplace_back();
}

如果你真的需要指针,最好选择智能指针。

【讨论】:

  • 对象的向量,而不是指针?不是一个好主意,简单案例的事件。对象可能包含可能在排序时丢失的指针。搬家等
  • 您的“最佳选择”依赖于复制构造函数的正确实现。注意额外的副本在这里非常重要。
  • @AlexG.P.如果复制构造函数编写正确,则不会。避免使用原始指针是编写更安全代码的好方法。
【解决方案2】:

在 C++ 中,如果您不使用任何内存管理器、智能指针或某种“托管”环境,则使用关键字 new 创建的类。为避免误解,能否请您发布 Object 和方法 List.Add 的构造函数?

所以,当您创建新对象时:

Object* o = new Object();

您在堆中保留空间并将指向该空间的指针存储在指针“o”中。如果你从不打电话

delete o;

明确地你的对象永远不会被删除。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2020-07-09
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    相关资源
    最近更新 更多