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 - staticdynamic - 如何工作?它们是由TStruct constructor 自动初始化的,还是我必须通过循环它们并为每个 TStruct 成员设置值来手动初始化它们?

【问题讨论】:

在一个不相关的节点上,对空指针做delete是可以的。 @JoachimPileborg 所以如果我每次都将指针设置为空值,我可以使用delete 没有任何问题? 【参考方案1】:

TStruct 构造函数将使用您显示的代码调用 300 次。数组arr 中的每个元素执行一百次,为arr2 分配内存时执行两百次。

对于数组arr,编译器会生成代码来调用构造函数,当你使用new[]时,操作符会确保构造函数被调用。

【讨论】:

所以,为了让它工作,我需要一个零参数(void)的构造函数,因为它在我的代码中,一切都会好起来的? 对了,你能不能回答我这个问题,拜托:我需要在allocatingnew[]之前设置一个pointerNULL吗? @lolofon 除非您打算检查它是否为空指针,否则您不需要将指针初始化为空(NULL0nullptr)。如果您在定义时进行初始化(就像您在此处使用 arr2 所做的那样),那么您不能“预初始化”指针。 :)【参考方案2】:

为每个 TStruct 实例调用默认构造函数。 在您的代码 sn-p 中,有 300 个实例和 300 个默认构造函数调用。

在构造函数调用方面,newnew[] 创建的实例与堆栈上的“正常”创建没有区别。

在您的示例中,您创建了一个默认构造函数,每个实例都会调用该构造函数。

如果不存在这样的自定义默认构造函数,系统会创建一个自动生成的默认构造函数。生成的会调用每个数据元素的默认构造函数。

如果定义具有动态部分的类,如问题中(使用new 保留内存并将内存地址分配给指针),您需要关心指针值:将指针值设置为@987654324 @/nullptr在实例化的时候很重要。

原因是,您(或使用该类的人)可能会突然将delete 应用于他的实例的指针值。指针的默认值是 not null,而是内存中的随机地址。删除此默认随机地址处的对象可能会导致意外行为或程序崩溃。

【讨论】:

【参考方案3】:

initialization 这两个arrays - staticdynamic - 如何工作?它们是由TStruct constructor 自动初始化的,还是我必须通过循环它们并为每个 TStruct 成员设置值来手动初始化它们?

两个语句都会为每个实例化的元素调用TStruct 默认构造函数,您无需手动执行任何操作

【讨论】:

“默认构造函数”是指由程序隐式创建的构造函数(未初始化的值)还是我创建的构造函数? @lolofon 如果您提供默认构造函数(即,一个不带参数或所有参数都具有默认值的构造函数),您的定义将被调用。

以上是关于C++ 静态和动态数组初始化的主要内容,如果未能解决你的问题,请参考以下文章

数组静态初始化和动态初始化

JAVASE 数组: 一维数组二维数组动态数组静态数组

Java中一维,二维数组的静态和动态初始化

C# 与 C++ 静态数组中静态常量列表初始化的效率

数组-静态初始化和动态初始化

c中啥是静态初始化和动态初始化,怎么理解静态和动态。