这段代码会避免泄漏内存吗?

时间:2011-08-05 11:26:43

标签: c++

我不确定下面的代码会导致内存泄漏吗?

char **a;
a = new char* [m];
a[0] = new char[m * n]; // allocate all need
for(int i=1; i<m; i++)
{
a[i] = a[i-1] + n;//allocate every pointer
}
delete[] a[0];
delete[] a;

3 个答案:

答案 0 :(得分:4)

如果您的代码运行完成,则没有内存泄漏。如果抛出任何异常,那么你就会泄漏。

答案 1 :(得分:3)

没关系。您有两个分配和两个解除分配,具有匹配类型和匹配指针。你不会泄漏任何记忆。

答案 2 :(得分:1)

如果第二个new失败,那么它将抛出异常并且不会删除第一个分配,从而导致泄漏。

避免这种情况的最佳方法是使用资源管理类,而不是手动管理内存。在这种情况下,std::vector最好:

std::vector<char> memory(m * n);
std::vector<char*> pointers;

pointers.reserve(m);
pointers.push_back(&memory.front());
for (int i = 1; i < m; ++i) {
    pointers.push_back(pointers.back() + n);
}

现在,无论代码是正常完成还是抛出异常,都可以保证析构函数被调用,因此在任何一种情况下都不会泄漏。