gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:28:31 25 4
gpt4 key购买 nike

所以假设我在 .h 文件中有一个类的这些私有(private)数据成员

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,"\0");
strcpy(pointer[0].todo,"\0");
strcpy(pointer[0].where,"\0");
strcpy(pointer[0].when,"\0");
strcpy(pointer[0].attended,"\0");
strcpy(pointer[0].excitement,"\0");


}

我主要好奇:

  1. 可以在我的构造函数中分配我的结构数组吗?它会引起任何问题吗?
  2. 在将指针初始化为 NULL 之前分配数组是否可以?我假设这没什么大不了的,因为我在某种程度上将它初始化为指向动态数组的指针。但我想知道这是否是一种可以接受的做法。
  3. 像我那样初始化数组的第一个元素有意义吗?我想既然内存是为数组的至少一个元素(基数)分配的,那么初始化第一个元素是一个好习惯,但我仍然有点怀疑我是否正在可视化 correy。
  4. 最后,在创建动态数组并将指针设置为 NULL 之后,这只会造成内存泄漏,并且不会初始化第一个元素,对吧?

最佳答案

  1. 是的,这很好,事实上,在构造函数中分配并在析构函数中删除是 RAII 类型的开始,您应该努力实现这一目标。
  2. 您只是将指针分配给一些内存,指针之前持有什么并不重要,它可以是任何东西。
  3. 这完全取决于您的应用。
  4. 是的,你会的。您需要删除您创建的所有内存。我建议在你类(class)的析构函数中。请记住将 new[]delete[] 匹配。

最后一点,这种类型的代码适合学习,但不适合在 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。这应该会让您省去一些麻烦。

关于c++ - 在同一构造函数中初始化和分配动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46534967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com