C++ C++;静态和动态数组初始化
让我们有一个以下代码:C++ C++;静态和动态数组初始化,c++,arrays,initialization,C++,Arrays,Initialization,让我们有一个以下代码: #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
#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;
}
#包括
结构TStruct{
int x;
int-y;
int*ptr;
TStruct(void):x(0),y(0),ptr(nullptr){
};
int main(){
TStruct arr[100];
TStruct*arr2=新的TStruct[200];
//一些使用这些数组的代码
对于(int i=0;i<100;i++)
if(arr[i].ptr!=nullptr)
删除[]arr[i].ptr;
对于(int i=0;i<200;i++)
if(arr2[i].ptr!=nullptr)
删除[]arr2[i].ptr;
删除[]arr2;
返回0;
}
这两个
数组的初始化
-静态
和动态
是如何工作的?它们是由TStruct构造函数自动初始化的
还是我必须通过循环它们并为每个TStruct成员设置值来手动初始化它们?您显示的代码将调用TStruct
构造函数300次。数组中的每个元素有一百次arr
,为arr2
分配内存时有两百次
对于数组arr
,编译器生成调用构造函数的代码,当您使用new[]
时,操作符将确保调用构造函数
这两个数组的初始化
-静态
和动态
是如何工作的?它们是由TStruct构造函数自动初始化的,还是我必须通过循环它们并为每个TStruct成员设置值来手动初始化它们
这两条语句都将为实例化的每个元素调用TStruct
默认构造函数,您不需要手动执行任何操作。为TStruct的每个实例调用默认构造函数。
在代码段中,有300个实例和300个默认构造函数调用
当涉及到构造函数调用时,由new
、new[]
创建的实例与堆栈上的“正常”创建没有区别
在您的示例中,您创建了一个默认构造函数,每个实例都会调用该构造函数
如果不存在这样一个自定义默认构造函数,系统将创建一个自动生成的默认构造函数。生成的构造函数将调用每个数据元素的默认构造函数
如果有人定义了带有动态部分的类,比如在问题中(使用new
来保留内存并将内存地址分配给指针),您需要关心指针值:在实例化时将指针值设置为NULL
/nullptr
,这一点非常重要
原因是,您(或使用该类的人)可能会突然对其实例的指针值应用delete
。指针的默认值不是null,而是内存中的随机地址。删除此默认随机地址处的对象可能会导致意外行为或程序崩溃。在不相关的节点上,可以对空指针执行delete
。@JoachimPileborg因此,如果每次都将指针设置为空值,我可以使用“默认构造函数”使用delete
,而不会出现任何问题您是指由程序隐式创建的构造函数(未初始化的值)还是我创建的构造函数?@lolofon如果您提供默认构造函数(即不带参数或所有参数都有默认值的构造函数),将调用您的定义。因此,为了使其工作,我需要一个参数为零的构造函数(void)因为它在我的代码中,一切都会好起来的?顺便问一下,你能回答我这个问题吗:在分配new[]
之前,我是否需要将指针设置为NULL
?@lololofon除非你计划检查它是否为NULL指针,否则你不需要初始化指向NULL的指针(NULL
、0
或nullptr
)。如果您在定义时进行初始化(就像您在这里使用arr2
),则无法“预初始化”指针。:)