【问题标题】:Destructor for primitive type dynamically allocated array?原始类型动态分配数组的析构函数?
【发布时间】:2012-02-29 03:35:08
【问题描述】:
如果我想删除一个动态分配的原始类型值数组:
int *it = new int[10]
我是否只是将delete [] it 放入析构函数中以确保正确释放内存?
或
意识到,由于指针是原始类型,删除动态分配的数组是否需要在析构函数中执行类似的操作:
for (size_t idx = 0; idx != 5; ++idx)
delete sp[idx];
delete[] sp;
我对此感到很困惑,因为我的程序中有很多与内存相关的错误。
【问题讨论】:
标签:
c++
memory-leaks
memory-management
destructor
【解决方案1】:
如果你有:
int* it = new int[10];
delete的正确方法是:
delete[] it;
如果你有一个这种类型的成员变量,你需要实现一个复制构造函数和赋值操作符,因为它们的默认版本是不够的,或者使类不可复制。
由于这是 C++,我建议改用 std::vector<int>,因为这将为您处理内存管理。
【解决方案2】:
如果您要使用new 和delete,则要遵循的一般规则是:使用与news 一样多的deletes。
在您的情况下,您只调用了一次 new[]。你应该只调用一次delete[]。
顺便说一句,如果您曾经将指针存储在成员变量中,请考虑Rule of Three。
我说“如果你打算使用new 和delete”,因为你通常不应该这样做。使用 RAII 技术和标准容器,完全可以编写非常有用的程序,而不会直接调用 new 或 delete。
如果您尝试维护ints 数组,请使用std::vector:
class MyClass {
std::vector<int> it;
void SomeFun() { it.resize(10); }
};
然后,在你的析构函数中,什么都不做。完全没有你的帮助,向量就会消失。