C++中带有指针数组的类的析构函数

4
如果我有一个带有指向另一个类Vehicle的指针数组的类:
class List {
    public:
        //stuff goes here
    private:
        Vehicle ** vehicles;
}

如果我现在编写类 List 的析构函数,我需要手动迭代数组(我知道数组中有多少项),并删除每个指向车辆的指针,还是C ++会自动调用数组中所有车辆的析构函数?(就像如果类中有私有字符串/...或者它是一个指向Vehicle指针的STL容器一样)
编辑: 我忘记了delete [] vehicles,但如果我这样做,它是否也会删除数组中所有车辆使用的内存,还是只会删除指针使用的内存?

使用 vectorboost::scoped_ptr。如果你使用的是C++0x,那就使用 vectorstd::unique_ptr - Alexandre C.
@Alexandre 这是我正在学习的一门课程以前考试中的一个小问题,如果允许使用向量,我会使用它 :) - Aerus
@Alexandre:哈哈,幸运的是,这是他们唯一使用数组等等的时候。我相信他的意图是为了阐明多态性和数组之类的东西... - Aerus
4个回答

7
你需要删除数组中的所有元素,然后删除该数组。在 C++(STL)中有一些方法可以避免这种情况:使用向量,这样你就不必删除数组。对于每个车辆,使用 scoped_ptr/shared_ptr,这样你就不必删除车辆了。

一个澄清,STL只是C++标准库的一个子集。shared_ptr不是STL的一部分,而是C++标准库的一部分(如在即将发布的C++0x中定义以及包含在Boost集合中)。scoped_ptr不是任何版本的C++标准库的一部分,只有Boost中有。 - mloskot

3
如果列表拥有车辆对象(在构造函数中创建它们),则需要删除每个单独的对象,然后再删除指针数组本身。

无论可用更好的选项如STL,在学习一门语言时掌握这个概念很重要。需要特别注意的一条规则是,如果使用new[]进行分配,则必须使用delete[]进行释放,否则会遇到数据破坏的问题。 - gravitron

2
如果我有一个指向另一个类Vehicle的指针数组的类:

Vehicle ** vehicles;

vehicles不是指针数组,而是指向指向Vehicle类型的指针的指针。指针数组将被定义为Vehicle* vehicles[N]

我需要手动遍历数组(我知道数组中有多少项)并删除每个指向车辆的指针吗?

是的!你不想让你的代码泄漏内存,对吧?我建议使用Boost库中的Boost::scoped_ptr。此外,如果您的编译器支持C++0x,还可以使用std::unique_ptr

这是我的教授在一次练习中解释的方式,而且说实话,我也认为应该是 Vehicle * vehicles[n] :) - Aerus

0

您需要手动迭代每个车辆并删除它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接