删除多维数组 在C++ FAQ中,[16.16 ]给出了以下例子, void manipulateArray(unsigned nrows, unsigned ncols[]) { typedef Fred* FredPtr; FredPtr* matrix = new FredPtr[nrows]; // Set each element to NULL in case there is an exception later. // (See comments at the top of the try block for rationale.) for (unsigned i = 0; i < nrows; ++i) matrix[i] = NULL; try { for (unsigned i = 0; i < nrows; ++i) matrix[i] = new Fred[ ncols[i] ]; for (unsigned i = 0; i < nrows; ++i) { for (unsigned j = 0; j < ncols[i]; ++j) { someFunction( matrix[i][j] ); } } if (today == "Tuesday" && moon.isFull()) { for (unsigned i = nrows; i > 0; --i) delete[] matrix[i-1]; delete[] matrix; return; } ...code that fiddles with the matrix... } catch (...) { for (unsigned i = nrows; i > 0; --i) delete[] matrix[i-1]; delete[] matrix; throw; // Re-throw the current exception } for (unsigned i = nrows; i > 0; --i) delete[] matrix[i-1]; delete[] matrix; }

删除多维数组 在C++ FAQ中,[16.16 ]给出了以下例子, void manipulateArray(unsigned nrows, unsigned ncols[]) { typedef Fred* FredPtr; FredPtr* matrix = new FredPtr[nrows]; // Set each element to NULL in case there is an exception later. // (See comments at the top of the try block for rationale.) for (unsigned i = 0; i < nrows; ++i) matrix[i] = NULL; try { for (unsigned i = 0; i < nrows; ++i) matrix[i] = new Fred[ ncols[i] ]; for (unsigned i = 0; i < nrows; ++i) { for (unsigned j = 0; j < ncols[i]; ++j) { someFunction( matrix[i][j] ); } } if (today == "Tuesday" && moon.isFull()) { for (unsigned i = nrows; i > 0; --i) delete[] matrix[i-1]; delete[] matrix; return; } ...code that fiddles with the matrix... } catch (...) { for (unsigned i = nrows; i > 0; --i) delete[] matrix[i-1]; delete[] matrix; throw; // Re-throw the current exception } for (unsigned i = nrows; i > 0; --i) delete[] matrix[i-1]; delete[] matrix; },c++,C++,在这个函数的末尾。您缺少的是可怕的邪恶缩进 删除矩阵[i-1];每次循环迭代执行一次,并删除嵌套数组。 删除矩阵仅在循环完成并删除外部数组后发生一次 不要在C++中编写这样的代码,使用vector代替.< /p> 捕获中也存在删除的原因是,如果捕获到异常,您仍有责任清理分配的内存。您缺少的是可怕的缩进 删除矩阵[i-1];每次循环迭代执行一次,并删除嵌套数组。 删除矩阵仅在循环完成并删除外部数组后发生一次 不要在C++中编写这样的代码,使用vector代替.< /p> 捕获中也存在删除的原因是,

在这个函数的末尾。

您缺少的是可怕的邪恶缩进

删除矩阵[i-1];每次循环迭代执行一次,并删除嵌套数组。 删除矩阵仅在循环完成并删除外部数组后发生一次

<>不要在C++中编写这样的代码,使用vector代替.< /p>
捕获中也存在删除的原因是,如果捕获到异常,您仍有责任清理分配的内存。

您缺少的是可怕的缩进

删除矩阵[i-1];每次循环迭代执行一次,并删除嵌套数组。 删除矩阵仅在循环完成并删除外部数组后发生一次

<>不要在C++中编写这样的代码,使用vector代替.< /p>
捕获中也存在删除的原因是,如果捕获到异常,您仍然负责清理分配的内存。

当您在循环中删除每一行时,您正在释放分配给相应行的内存。然后,您需要释放为指向每一行的指针分配的内存

这样想:

FredPtr* matrix = new FredPtr[nrows];
为行分配一个指针数组,最后需要释放它

然后对于每一行

matrix[i] = new Fred[ ncols[i] ];

为指向列的指针数组分配内存-需要单独释放该数组。

在循环中删除每一行时,将释放分配给相应行的内存。然后,您需要释放为指向每一行的指针分配的内存

这样想:

FredPtr* matrix = new FredPtr[nrows];
为行分配一个指针数组,最后需要释放它

然后对于每一行

matrix[i] = new Fred[ ncols[i] ];

为指向列的指针数组分配内存-需要单独释放。

是的,这不是示例代码的质量,但工作正常。需要在catch块中和catch块之后复制粘贴的代码,因为在发生异常的情况下,应该释放内存,在这种情况下,将异常转发给该函数的调用方。如果你不想转发这个异常,你可以删除catch块中的代码,但至少控制台输出会更好

是的,这不是示例代码的质量,但它运行良好。需要在catch块中和catch块之后复制粘贴的代码,因为在发生异常的情况下,应该释放内存,在这种情况下,将异常转发给该函数的调用方。如果你不想转发这个异常,你可以删除catch块中的代码,但至少控制台输出会更好

try…catch中的catch块用于在抛出异常时删除矩阵,然后重新抛出异常


如果没有抛出异常,则catch块永远不会命中,并且必须在通过例程的正常退出的过程中删除矩阵。

try…catch中的catch块用于在抛出异常时删除矩阵,然后重新抛出异常

如果没有抛出异常,则catch块永远不会被命中,并且必须在例程正常退出的过程中删除矩阵

try/catch块是确保正确清理所必需的,即使在正常清理发生之前在代码中的任何地方抛出异常也是如此。这包括一个新表达式中的异常。delete[]是安全的,因为所有相关指针最初都设置为零,因此即使从未发生分配,删除也是有效的

请注意,如果发生任何异常,它仍将在函数外部传播。本地try/catch块仅确保函数本身不会泄漏任何内存

有两组数组:一组是外部数组矩阵,它是指针数组。此数组首先被分配,最后被删除。其次,每个元素矩阵[i]本身就是一个指向Fred元素数组的指针。每个数组在第一个for循环中分配,因此必须在最后的另一个循环中删除

try/catch块是确保正确清理所必需的,即使在正常清理发生之前在代码中的任何地方抛出异常也是如此。这包括一个新表达式中的异常。delete[]是安全的,因为所有相关指针最初都设置为零,因此即使从未发生分配,删除也是有效的

请注意,如果发生任何异常,它仍将在函数外部传播。本地try/catch块仅确保函数本身不会泄漏任何内存

有两组数组:一组是外部数组矩阵,它是指针数组。此数组首先被分配,最后被删除。其次,每个元素矩阵[i]本身就是指向 Fred元素的数组。每个数组在第一个for循环中分配,因此必须在最后的另一个循环中删除


这段代码实际上是关于什么是异常、什么不是异常以及如何使用异常的一个很好的例子:异常表示异常情况,它们不是错误代码。这段代码实际上是关于什么是异常、什么不是异常以及如何使用异常的一个很好的例子:异常表示异常情况,它们不是错误代码。