【问题标题】:class has class with dynamic array member类具有具有动态数组成员的类
【发布时间】:2013-10-01 13:55:32
【问题描述】:

我有一个带有动态数组 (DA) 的类

class DA{
  private:
    double* array;
    int size N;
    //other stuff
  public:
    DA(){
       array=NULL;
    }
    DA(int PN){
      N=PN;
      array=new double[N];
    };
    //destructor and other stuff
}

这似乎没问题。现在我想要一个具有一个 DA 对象的“应用程序”类:

class App{
  private:
    DA myDA;
  public:
    App(int N){
      //create myDA with array of size N
      DA temp(N);
      myDA=temp;
    };
}

问题是,我不知道如何在 App 构造函数中创建 myDA。我这样做的方式是为 temp 分配内存,然后 myDA 指向 temp。但我猜为 temp 分配的内存在构造函数完成后被删除。因此,当我执行我的程序时出现内存错误。那么如何正确分配内存呢?

【问题讨论】:

  • 您可能对the rule of three 感兴趣。您还应该考虑使用std::vector<double> 而不是动态数组。
  • 请注意,array = new double(N); 正在创建一个指向单个 double 的指针。我猜你的意思是array = new double[N];
  • @juanchopanza:是的,我就是这个意思。谢谢!
  • 类的职责应该尽可能少。内存管理本身就是一项巨大的责任,会引发类创作问题(三法则)、异常安全问题(C++ 初学者和中级几乎不可能正确解决)、增加代码复杂性、引入对某些数据结构的硬编码依赖,等等。最好跳过(更喜欢值类型)或将内存管理外包给智能指针和(甚至更好)标准容器。
  • @phresnel:我不想使用像vector这样的容器的原因,因为我担心性能下降。 DA 的数组成员应该包含类似 10^6 的双精度数。那这些容器不会有问题吗?

标签: c++ memory dynamic allocation


【解决方案1】:

使用构造函数初始化列表:

App(int N) : myDA(N) {}

请注意,您的 DA 类已损坏,除非您遵循 rule of three,或使用 std::vector<double>、std::unique_ptr<double[]> 或 boost scoped array 简化问题:

#include <vector>

class DA{
  private:
    std::vector<double> data; // "array" is a std lib container name
  public:
    DA(int PN) : data(PN) {}
    // no need to write destructor, copy constructor or assignment operator.
};

【讨论】:

  • 非常感谢您的帮助!这有效:) 但我不确定我是否理解它:我现在应该始终通过 App(N) 创建“App”对象。然后自动创建一个带有 N 维数组的“DA”对象。这是正确的吗?
  • @user2609987 很高兴它有帮助。但是你不明白哪一部分?
  • 我的“DA”课以后会很重,N=10^6 或类似的东西。这个数组解决方案不会比使用矢量更快吗?如果一旦我不想更改数组的大小就创建了“DA”,那么我不需要向量,对吗?关于“RuleOf3”:我现在需要一个析构函数和复制构造函数,以确保不仅复制/破坏指向数组的指针,还复制/破坏整个数组。如果我实现这个,就可以了吗?
  • @user2609987 使用vector 而不是动态分配的数组,您不应该得到任何开销。你的类会大一点字节,但这并不重要。关于三规则,您也必须实现一个复制赋值运算符。或者,如果更适合设计,则不允许复制和分配您的课程。
  • 好的,我现在使用矢量。非常感谢您的帮助!
猜你喜欢
  • 2012-12-15
  • 2013-05-11
  • 2020-07-25
  • 2015-11-01
  • 1970-01-01
  • 2011-01-08
  • 2010-10-17
  • 2016-06-27
相关资源
最近更新 更多