【发布时间】:2012-12-22 21:45:24
【问题描述】:
我有一个函数来分配一个二维数组,以免占用比我需要的更多的内存:
_>
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] ,我们正在访问未分配的内存,因此应用程序此时会失败,并且无法捕获错误。
【问题讨论】:
-
1) 如果
new失败,mem isn't anything because it's out of scope, becausenew` 会在失败时抛出异常(我想你知道这是因为你试图捕捉它)。 2)如果你不能对它做任何事情,那么捕捉异常有什么意义? 3) 使用std::vector<>4) 在你的代码工作之前停止担心性能。给你:int main(){}世界上最快的托管 C++ 程序!带你去任何地方? -
new失败后你打算做什么? -
@Victor Ruiz:当您说“不推荐第二种方式”时,您是指“基于try-catch的第二种解决方案”,还是“问题中的第二个代码示例”(您的第一个解决方案是基于try-catch)?
-
现在,我明白了,我很傻。但是如果我想知道什么新的失败,第一个或第二个,我应该使用第一个解决方案还是第二个?
标签: c++ memory-management