使用指针和 new 初始化时动态(多维度)数组的范围

老师

我现在很困惑。我看到过类似的问题,我的实现似乎与这些解决方案一致,但我就是无法让它发挥作用。

我需要一个UtilClass可以初始化和转储多维动态数组的东西。我只想将指针传递给BaseClass 我想要初始化的数组以及暗淡。我选择使用new关键字而不是malloc(),但我担心指针的范围仅限于init函数而不是BaseClass(或数组指针)的生命周期,这就是dump函数产生 SEGFAULT 的原因。

这里有一些代码来解释:

// BaseClass.h
#pragma once
include "UtilClass.h"

class BaseClass
{
public:
  UtilClass* util{nullptr};
  double** array{nullptr};
};


// BaseClass.cpp
#include "BaseClass.h"

BaseClass::BaseClass() {
  util = new UtilClass();
  util->init(array, 4, 6);
  util->dump(array, 4, 6);
}
// UtilClass.h
#pragma once

class UtilClass {
  void init(double** array, int rows, int cols);
  void dump(double** array, int rows, int cols);
};

// UtilClass.cpp
#include "UtilClass.h"

void UtilClass::init(double **darray, int rows, int cols) {
  int i,j;
  array = new double*[rows];
  for (i = 0; i < rows; i++)
      array[i] = new double[cols];

  for (i = 0; s < rows; i++)
      for (j = 0; a < cols; j++) {
          data[i][j] = 1;
          std::cout << "Data in array " << data[i][j] << std::endl; // This obviously works
      }
}

void dump(double** array, int rows, int cols) {
  int i, j;
  for (i = 0; i < rows; i++)
      for (j = 0; j < cols; j++)
          std::cout << array[i][j] << " "; // But this produces a SEGFAULT
      std::cout << std::endl;
}

夸拉

让我从一条建议开始:最好重用现有工具。考虑使用std::vector动态分配的数组。这是经过良好测试、优化且易于使用的。否则,您将需要处理内存管理的难题(例如,取消分配 dtor 中分​​配的内存块BaseClass)。

关于您的问题:当您调用时init,您按值传递指针。这意味着该init方法分配了一些内存并将指向它的指针存储在其本地副本中darray最后,init这个局部变量消失了(你失去了对它的访问权限,泄漏了整个分配的内存)。将方法更改为:

  void UtilClass::init(double ***array, int rows, int cols) {
  int i,j;
  *array = new double*[rows];
  for (i = 0; i < rows; i++)
      (*array)[i] = new double[cols];

  for (i = 0; i < rows; i++)
      for (j = 0; j < cols; j++) {
          (*array)[i][j] = i*j;
          std::cout << "Data in array " << (*array)[i][j] << std::endl; // This obviously works
      }
  }

调用转储时,需要传递 4 和 6(而不是 5 和 6)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章