c++ - 使用 new 分配多维数组

标签 c++ exception initialization try-catch new-operator

当我使用 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::vectorstd::shared_ptr (等等)为您管理内存。

2) 对于内置类型也是如此,但至少在分配失败时唯一抛出的异常是 std::bad_alloc

关于c++ - 使用 new 分配多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15434282/

相关文章:

c++ - 推送数组 C++?

c++ - 如何在卡萨布兰卡捕获多个任务的异常

arrays - Swift 3 - 如何初始化多维字符串数组?

c++ - 如何在 C++11 中处理互斥成员函数

c++ - MFC中如何停止主线程和等待子线程

java - 尝试使用 Microsoft Translator API 进行翻译时出现 unknownHostException

java - 在 Controller JavaFX 的初始化方法中获取 NullPointerException

java - 关于使用Spring框架创建实例的问题?

c++ - 这段代码怎么会是 constexpr? (std::计时)

python - 检查python中函数参数的范围