当我使用 分配多维数组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];
?
谢谢
编辑
部分答案在常见问题解答的下一项中