所以我有一个名为List的类,它存储一个指向Object类型的指针的向量。 List有一个名为add的函数,它初始化一个Object类并将它的指针添加到向量中。我认为一旦add函数结束,Object类就会被销毁并且访问指针会导致异常。当我编写测试程序来测试它时,结果发现Object类从未被销毁过。
一旦函数结束,函数内部初始化的类是否会被破坏?
课程什么时候自动销毁?
答案 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;
明确地说你的对象永远不会被删除。