析构函数为原始类型动态分配数组?

时间:2012-02-07 17:23:21

标签: c++ memory-leaks memory-management destructor

如果我想删除动态分配的基本类型值数组:

int *it = new int[10]

我只是将delete [] it放在析构函数中以正确释放内存吗?

OR

意识到,作为指针是基本类型,删除动态分配的数组会涉及在析构函数中执行类似的操作:

for (size_t idx = 0; idx != 5; ++idx)
        delete sp[idx];
    delete[] sp;

我对此感到困惑,因为我的程序中存在很多与内存相关的错误。

2 个答案:

答案 0 :(得分:5)

如果你有:

int* it = new int[10];

delete的正确方法是:

delete[] it;

如果你有这种类型的成员变量,你需要实现一个复制构造函数和赋值运算符,因为这些的默认版本是不够的,或者使类不可复制。

由于这是C ++,我建议使用std::vector<int>,因为这将为您处理内存管理。

答案 1 :(得分:2)

如果您要使用newdelete,则要遵循的一般规则是:使用尽可能多的delete s new。< / p>

在您的情况下,您只调用了new[]一次。你应该只使用delete[]一次。

顺便说一句,如果您将指针存储在成员变量中,请考虑Rule of Three

我说“如果你打算使用newdelete”,因为你经常不应该这样做。使用RAII技术和标准容器,完全可以编写永远不会直接调用newdelete的完全有用的程序。

如果您尝试维护int的数组,请使用std::vector

class MyClass {
    std::vector<int> it;

    void SomeFun() { it.resize(10); }
};

然后,在你的析构函数中,什么都不做。在你没有任何帮助的情况下,矢量消失了。