【问题标题】:what is the differnce between these two method of Dynamic allocation of array in a class这两种在类中动态分配数组的方法有什么区别
【发布时间】:2015-09-23 13:38:26
【问题描述】:

我正在尝试在类中动态分配一个数组。遇到了一件很奇怪的事情。请看看这两段代码并告诉我区别。

class A{

public:
    int n;

    int *a;

    a = new int [4];

    ~A(){delete []a;}

    A(){}
}

使用 GCC 编译会产生以下错误:

a 不是名称类型

但是当我使用时:

class A{

public:

    int n;

    int *a = new int [4];

    A(){}
    ~A(){ delete []a;}
}

编译

【问题讨论】:

    标签: c++


    【解决方案1】:
    a= new int [4];
    

    不是初始化而是赋值,是不允许的。

    int *a = new int [4];
    

    in class initilization 一样工作,并且在 C++11 及更高版本中被允许。

    您还混合了new[]delete。每当您使用new 时,您都应该致电delete,而当您使用new[] 时,您需要致电delete[]

    现在,您应该使用std::vector 而不是处理指针和new[]delete[]

    【讨论】:

    • 请成为天使并说你必须使用delete[]
    【解决方案2】:

    这是一个初始化:

    int *a = new int [4];
    

    这是一个不能在类声明中完成的赋值,但可以在例如构造函数中完成:

    a = new int [4];
    

    另外,如果你使用new[],你也需要使用delete[],而不是delete

    【讨论】:

      【解决方案3】:

      我不清楚你到底要做什么,但这项工作应该在类的构造函数和析构函数中完成

      class A
      {
      public:
          A() { a = new int[4]; }
          ~A() { delete[] a; }
      private:
          int* a;
      };
      

      更好的是,如果您使用std::vector,您可以避免自己进行任何动态分配

      class A
      {
      public:
          A() : a(4) {}
      private:
          std::vector<int> a;
      };
      

      【讨论】:

      • 另外,您已经修复了使用 delete 时遇到的未定义行为。
      • Thnask Kramer .. 我没有特定的目标.. 只是一个查询.. .. 只是在玩,我经常使用向量..
      猜你喜欢
      • 1970-01-01
      • 2013-09-08
      • 2019-03-31
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2011-01-10
      相关资源
      最近更新 更多