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
),则无法“预初始化”指针。:)