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