我有一个函数来分配一个二维数组,以便不消耗比我需要的更多的内存:
_>
template <class Xvar> Xvar** New2 (unsigned int rows,unsigned int cols)
{
Xvar** mem;
unsigned int size, i;
size = rows * cols;
mem = new Xvar* [rows];
mem [0] = new Xvar [size];
for (i=1;i<rows;i++)
mem [i] = &mem [0][i*cols];
return mem;
}
现在,我需要检查该内存是否已分配。(处理内存分配错误),而不会降低函数的性能。
我应该为每个内存分配使用一个 try-catch 块,还是只为函数使用一个唯一的 try-catch 块。
template <class Xvar> Xvar** New2 (unsigned int rows,unsigned int cols)
{
Xvar** mem;
unsigned int size, i;
size = rows * cols;
try {
mem = new Xvar* [rows];
}
catch (...) { assert (...) }
try {
mem [0] = new Xvar [size];
} catch (...) { assert (...) }
for (i=1;i<rows;i++)
mem [i] = &mem [0][i*cols];
return mem;
}
或类似的东西:
template <class Xvar> Xvar** New2 (unsigned int rows,unsigned int cols)
{
try {
Xvar** mem;
unsigned int size, i;
size = rows * cols;
mem = new Xvar* [rows];
mem [0] = new Xvar [size];
for (i=1;i<rows;i++)
mem [i] = &mem [0][i*cols];
return mem;
}catch (...) { assert (...) }
}
我认为,不推荐第二种方式,因为如果第一个 new 失败,mem 为 NULL,所以如果我们执行 mem [0] ,我们正在访问未分配的内存,因此应用程序此时失败,并且无法捕获错误。