在另一个类中初始化的类,它是如何生存的?

时间:2012-12-14 18:53:21

标签: c++ class

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

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

课程什么时候自动销毁?

2 个答案:

答案 0 :(得分:4)

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

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();
}

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

答案 1 :(得分:-1)

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

的构造函数

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

Object* o = new Object();

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

delete o;

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