在同一构造函数中初始化和分配动态内存

Initializing and allocating dynamic memory in the same constructor

所以假设我在 .h 文件中有 class 的这些私有数据成员

private:
    eventlist *pointer;
    int counter; 
    int size;   

和这个结构类型

struct eventlist// Define our struct type
{
char name[100];
char todo[100];
char where[100];
char when[100];
char attended[100];
char excitement[100];
};

我想创建一个动态结构数组。这是我作为构造函数所拥有的...

summerlist::summerlist()
{
size = 0;// Initialize size to zero
counter = 0;//Initialize counter to zero
pointer = new eventlist[size];

    strcpy(pointer[0].name,"[=12=]");
    strcpy(pointer[0].todo,"[=12=]");
    strcpy(pointer[0].where,"[=12=]");
    strcpy(pointer[0].when,"[=12=]");
    strcpy(pointer[0].attended,"[=12=]");
    strcpy(pointer[0].excitement,"[=12=]");


   }

我主要好奇的是:

  1. 可以在我的构造函数中分配我的结构数组吗?它会引起任何问题吗?
  2. 在初始化指针为NULL之前分配数组可以吗?我假设这没什么大不了的,因为我在某种程度上将它初始化为指向动态数组的指针。但我想知道这是否是一种可以接受的做法。
  3. 像我这样初始化数组的第一个元素有意义吗?我想既然内存分配给了数组的至少一个元素(基数),那么初始化第一个元素是一个很好的做法,但我仍然有点怀疑我是否正在可视化 correy。
  4. 最后,在我创建动态数组并将指针设置为 = NULL 之后,这只会造成内存泄漏,并且不会初始化第一个元素,对吗?
  1. 是的,这很好,事实上,在构造函数中分配并在析构函数中删除是您应该实现的 RAII 类型的开始。
  2. 你只是简单地将一个指针分配给一些内存,之前的指针是什么并不重要,它可以是任何东西。
  3. 这完全取决于您的应用程序。
  4. 是的,你会的。您需要 delete 您创建的任何内存。我会建议在你的 class 的析构函数中。记得将 new[]delete[].
  5. 匹配

最后一点,这种类型的代码适合学习,但不适合在 c++ 中实现。除非你有某种形式的内存限制(你显然没有,因为你正在创建一大组动态存储结构)那么你应该切换到使用一些内置的 c++ 类型,比如 std::vector 来替换你的动态数组,以及 std::string 来替换您的 char 数组。

struct eventlist {
    std::string name;
    ...
}

class summerlist {

public:
    summerlist();

private:
    std::vector<eventlist> pointer;
    int counter; 
}

summerlist::summerlist()
{
    counter = 0;// Initialize the counter to zero
}

这更易于使用和控制。并且您避免了这样做的错误:pointer = new eventlist[size]; 其中 size 为 0。这应该会让您省去一些麻烦。