Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这段代码能避免内存泄漏吗?_C++ - Fatal编程技术网

C++ 这段代码能避免内存泄漏吗?

C++ 这段代码能避免内存泄漏吗?,c++,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; 那很好。您有两个分配和两个释放,具有匹配的类型和匹配的指针。您不会泄漏任何内存。如果代码运行到结束,则不会泄漏内

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

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;

那很好。您有两个分配和两个释放,具有匹配的类型和匹配的指针。您不会泄漏任何内存。

如果代码运行到结束,则不会泄漏内存。如果抛出任何异常,则您将泄漏。

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

避免这种情况的最好方法是使用资源管理类,而不是手动管理内存。在这种情况下,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);
}

现在,无论代码是否正常完成或引发异常,都保证调用析构函数,因此在任何情况下都不会发生泄漏。

除非分配失败并引发异常。除非你真的需要,否则不要使用手动分配。如果你关心新抛出的OOM情况,那么你是对的。我习惯于不抛出的嵌入式分配器,它们只是硬重置框:-这是真的,我认为代码很难看,但我只想确定如果行a[0]=new char[m*n],这一个会泄漏工作;投掷。分配内存后执行的所有其他语句都是禁止抛出的。我同意vector container为我们提供了极大的便利,但在效率方面,不是吗?除非禁用优化,或者您的实现非常糟糕,否则它应该与手动管理的阵列一样高效。我的代码的行为应该与你的代码几乎相同:两个内存分配、m个赋值和两个释放,所有函数调用都应该内联。异常安全可能会有成本,这取决于异常的管理方式,但无论您如何尝试修复泄漏,都会产生一些成本。