当我使用 new
分配多维数组时,我是这样做的:
void manipulateArray(unsigned nrows, unsigned ncols[])
{
typedef Fred* FredPtr;
FredPtr* matrix = new FredPtr[nrows];
for (unsigned i = 0; i < nrows; ++i)
matrix[i] = new Fred[ ncols[i] ];
}
哪里ncols[]
包含 matrix
中每个元素的长度, 和 nrows
matrix
中的元素数量.
如果我想填充 matrix
, 那么我有
for (unsigned i = 0; i < nrows; ++i) {
for (unsigned j = 0; j < ncols[i]; ++j) {
someFunction( matrix[i][j] );
但我正在阅读C++ FAQ ,谁告诉你要非常小心。我应该用 NULL
初始化每一行第一的。那么,我应该trycatch
行的分配。我真的不明白为什么这一切。我一直(但我是在开始时)用上面的代码以 C 风格初始化。
常见问题解答要我这样做
void manipulateArray(unsigned nrows, unsigned ncols[])
{
typedef Fred* FredPtr;
FredPtr* matrix = new FredPtr[nrows];
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] );
}
}
}
catch (...) {
for (unsigned i = nrows; i > 0; --i)
delete[] matrix[i-1];
delete[] matrix;
throw; // Re-throw the current exception
}
}
1/总是如此小心翼翼地初始化是牵强还是非常合适?
2/他们这样做是因为他们正在处理非内置类型吗?代码是否与 double* matrix = new double[nrows];
相同(谨慎程度相同)? ?
谢谢
编辑
部分答案在 next item in FAQ 中
最佳答案
之所以如此小心,是因为如果其中任何一个分配失败,或者如果 Fred 构造函数抛出异常,就会发生内存泄漏。如果您要在调用堆栈的更高层捕获异常,则您没有分配的内存的句柄,这就是泄漏。
1) 它是正确的,但通常如果您为了防止内存泄漏而费尽心思,您更愿意使用 std::vector
和 std::shared_ptr
(等等)为您管理内存。
2) 对于内置类型也是如此,但至少在分配失败时唯一抛出的异常是 std::bad_alloc
。
关于c++ - 使用 new 分配多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434282/