已分配的阵列已归零

时间:2012-11-27 21:13:27

标签: c++ memory-management c++11

在C ++ 11中,当我使用T *array = new T[n];分配动态数组时,已经归零(使用gcc 4.7.2,Ubuntu 12.10 64bit)。

  1. 这是由C ++ 11规范强制的吗?
  2. 如何在不归零其项目的情况下分配数组?这可能会快一点。
  3. 修改:我已为T = int检查了该内容。

    gcc cxx-flags -std=gnu++11 -O3 -ffast-math -fno-rtti

4 个答案:

答案 0 :(得分:6)

§5.3.4

  

如果省略new-initializer,则默认初始化对象(8.5);如果没有执行初始化,    该对象具有不确定的价值。

new-initializer是()中的new T[] (),您已省略。

§8.5/ 6

  

默认初始化T类型的对象意味着:

     

- 如果T是(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(并且   如果T没有可访问的默认构造函数,则初始化是错误的;)

     

- 如果T是数组类型,则每个元素都是默认初始化的;

     

- 否则,不执行初始化。

int []默认初始化 - >每个元素都是默认初始化的。

“这是由C ++ 11规范强制的吗?”:“没有执行初始化”,所以不,如果T没有归零构造函数(即T是POD),则不强制归零。对于T = int,不必执行归零。

为什么它为零呢?如果您的程序从操作系统分配新内存,则操作系统会为您清空新内存。如果你能读取另一个可能存储合理数据的程序的内存,那将是非常危险的。但是,如果您写入该内存,将其释放并再次分配一些内存,则不应将其归零。

答案 1 :(得分:4)

它不会被初始化(当然,如果T是一个类,仍然会调用构造函数)。强制值初始化(这是一个新手可能误导的名称 - 让我们称之为零初始化,它适用于原始类型,如int),做

new T[N]()

也就是说,只需加上一对括号。

答案 2 :(得分:3)

取决于您的实际类型T。它可能在某些条件下用零初始化。见这里:Default initialization in C++

答案 3 :(得分:2)

即使您可以使用C ++功能动态分配未初始化的内存(std::get_temporary_buffer?),操作系统的libc中malloc()::new的底层实现也是使用匿名{ {1}}用于大型分配块(其中 large 是可调参数)。并且匿名mmap()始终为零初始化。