C++ 静态和动态数组初始化
Posted
技术标签:
【中文标题】C++ 静态和动态数组初始化【英文标题】:C++ Static and Dynamic Array Initialization 【发布时间】:2016-04-18 22:55:18 【问题描述】:让我们有以下代码:
#include <iostream>
struct TStruct
int x;
int y;
int * ptr;
TStruct( void ) : x( 0 ), y( 0 ), ptr( nullptr )
;
int main()
TStruct arr[100];
TStruct * arr2 = new TStruct[200];
// some code working with these arrays
for( int i = 0; i < 100; i ++ )
if( arr[i] . ptr != nullptr )
delete [] arr[i] . ptr;
for( int i = 0; i < 200; i ++ )
if( arr2[i] . ptr != nullptr )
delete [] arr2[i] . ptr;
delete [] arr2;
return 0;
initialization
这两个 arrays
- static
和 dynamic
- 如何工作?它们是由TStruct constructor
自动初始化的,还是我必须通过循环它们并为每个 TStruct 成员设置值来手动初始化它们?
【问题讨论】:
在一个不相关的节点上,对空指针做delete
是可以的。
@JoachimPileborg 所以如果我每次都将指针设置为空值,我可以使用delete
没有任何问题?
【参考方案1】:
TStruct
构造函数将使用您显示的代码调用 300 次。数组arr
中的每个元素执行一百次,为arr2
分配内存时执行两百次。
对于数组arr
,编译器会生成代码来调用构造函数,当你使用new[]
时,操作符会确保构造函数被调用。
【讨论】:
所以,为了让它工作,我需要一个零参数(void)的构造函数,因为它在我的代码中,一切都会好起来的? 对了,你能不能回答我这个问题,拜托:我需要在allocating
和new[]
之前设置一个pointer
到NULL
吗?
@lolofon 除非您打算检查它是否为空指针,否则您不需要将指针初始化为空(NULL
、0
或 nullptr
)。如果您在定义时进行初始化(就像您在此处使用 arr2
所做的那样),那么您不能“预初始化”指针。 :)【参考方案2】:
为每个 TStruct 实例调用默认构造函数。 在您的代码 sn-p 中,有 300 个实例和 300 个默认构造函数调用。
在构造函数调用方面,new
、new[]
创建的实例与堆栈上的“正常”创建没有区别。
在您的示例中,您创建了一个默认构造函数,每个实例都会调用该构造函数。
如果不存在这样的自定义默认构造函数,系统会创建一个自动生成的默认构造函数。生成的会调用每个数据元素的默认构造函数。
如果定义具有动态部分的类,如问题中(使用new
保留内存并将内存地址分配给指针),您需要关心指针值:将指针值设置为@987654324 @/nullptr
在实例化的时候很重要。
原因是,您(或使用该类的人)可能会突然将delete
应用于他的实例的指针值。指针的默认值是 not null,而是内存中的随机地址。删除此默认随机地址处的对象可能会导致意外行为或程序崩溃。
【讨论】:
【参考方案3】:
initialization
这两个arrays
-static
和dynamic
- 如何工作?它们是由TStruct constructor
自动初始化的,还是我必须通过循环它们并为每个 TStruct 成员设置值来手动初始化它们?
两个语句都会为每个实例化的元素调用TStruct
默认构造函数,您无需手动执行任何操作。
【讨论】:
“默认构造函数”是指由程序隐式创建的构造函数(未初始化的值)还是我创建的构造函数? @lolofon 如果您提供默认构造函数(即,一个不带参数或所有参数都具有默认值的构造函数),您的定义将被调用。以上是关于C++ 静态和动态数组初始化的主要内容,如果未能解决你的问题,请参考以下文章