【发布时间】:2013-03-15 13:56:21
【问题描述】:
当我使用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
【问题讨论】:
-
专业提示:
std::vector之类的东西知道如何正确执行此操作。 -
@antitrust 要求使用低级解决方案,因此高级方法没有帮助。提示:一个新的可能会失败(内存不足)
-
除非您需要引用单个行/列,否则具有一维向量和合适的两个索引访问的简单实现非常适合动态矩阵结构。
-
只是一个小评论:catch 块中的删除循环应该删除所有分配的内存,包括
matrix[0]。因此,循环应该修改为for (unsigned i = nrows; i>=0; --i)。 -
@JSQuareD 我在做
delete[] matrix[i-1];和i-1对吧?
标签: c++ exception initialization try-catch new-operator