0

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

一旦函数结束,函数内部初始化的类是否会被销毁?

类什么时​​候自动销毁?

4

2 回答 2

4

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

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

然后,您将obj使用自动存储持续时间进行创建。这意味着它将在add函数结束时被销毁。您推入向量中的指针将不再指向有效的Object,因此绝对不要这样做。

但是,您可能会这样做:

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

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

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

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

或者在 C++11 中:

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

如果您真的需要指针,请选择智能指针。

于 2012-12-14T18:57:15.120 回答
-1

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

因此,当您创建新对象时,例如:

Object* o = new Object();

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

delete o;

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

于 2012-12-14T19:07:08.827 回答