首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++堆对象的初始化

c++堆对象的初始化
EN

Stack Overflow用户
提问于 2012-02-04 23:31:46
回答 4查看 6.8K关注 0票数 1

我想知道在heap上用new创建的对象中的内置类型是否会被初始化为零?它是标准规定的,还是特定于编译器的?

给定以下代码:

代码语言:javascript
复制
#include <iostream>

using namespace std;

struct test
{
    int _tab[1024];
};

int main()
{
    test *p(new test);

    for (int i = 0; i < 1024; i++)
    {
        cout << p->_tab[i] << endl;
    }

    delete p;
    return 0;
}

运行时,它打印全零。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-04 23:37:40

不,如果你这样做:

代码语言:javascript
复制
int *p = new int;

代码语言:javascript
复制
char *p = new char[20];  // array of 20 bytes

代码语言:javascript
复制
struct Point { int x; int y; };
Point *p = new Point;

p指向的内存将具有不确定/未初始化的值。

但是,如果您这样做:

代码语言:javascript
复制
std::string *pstring = new std::string();

然后,您可以确信字符串将被初始化为空字符串,但这是因为类构造函数的工作方式,而不是因为有关堆分配的任何保证。

票数 2
EN

Stack Overflow用户

发布于 2012-02-05 00:11:38

您可以选择是默认初始化(保留基础类型(和一般的POD类型)未初始化)还是值初始化(零初始化基础(和POD)类型)。

代码语言:javascript
复制
int * garbage = new int[10];    // No initialisation
int * zero    = new int[10]();  // Initialised to zero.

这是由标准定义的。

票数 11
EN

Stack Overflow用户

发布于 2012-02-04 23:37:41

这不是标准所要求的。基元类型成员的内存可以包含最后留在内存中的任何值。

我猜有些编译器可能会选择初始化字节。许多都是在代码的调试版本中这样做的。它们分配一些已知的字节序列,在调试时给你一个提示,内存不是由你的程序代码初始化的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9141970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档