所以我有一个名为 List 的类,它存储一个指向 Object 类型的类的指针向量。List 有一个名为 add 的函数,它初始化一个 Object 类并将它的指针添加到向量。我认为一旦 add 函数结束,Object 类将被破坏并且访问指针会导致异常。当我编写一个测试程序来测试它时,结果证明 Object 类从未被破坏。
一旦函数结束,函数内部初始化的类是否会被销毁?
类什么时候自动销毁?
取决于您如何创建对象。如果你这样做:
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();
}
如果您真的需要指针,请选择智能指针。
在 C++ 中,如果您不使用任何内存管理器、智能指针或某种“托管”环境,则使用关键字new创建的类。为避免误解,您能否发布 Object 和方法 List.Add 的构造函数?
因此,当您创建新对象时,例如:
Object* o = new Object();
您在堆中保留空间并将指向该空间的指针存储在指针'o'中。如果你从不打电话
delete o;
明确地你的对象永远不会被删除。