【问题标题】:Initial Value of Dynamically-Allocated Memory in C++C++中动态分配内存的初始值
【发布时间】:2012-09-15 05:04:53
【问题描述】:

在C++中,当你动态分配int的数组时,ints的值是未定义还是初始化为0?

    int *array = new int[50];

【问题讨论】:

  • 总是垃圾;什么都留在那里。

标签: c++ memory dynamic


【解决方案1】:

术语未初始化。但这取决于您如何初始化数组。你可以对它进行值初始化

int *array = new int[50]();

值将是 0。

如果你让它未初始化,你就无法知道那里有什么值,因为读取它们是未定义的行为。

【讨论】:

    【解决方案2】:

    如果你使用向量而不是数组,你会得到所有元素的初始值 0:

    std::vector<int> v(50);
    

    如果你想要一个不同的默认值,你可以指定一个:

    std::vector<int> v(50, 42);
    

    向量的另一个好处是您不必手动释放底层数组。

    【讨论】:

    • 我总是忘记建议vector 之类的:)
    【解决方案3】:

    回答你的问题没有。但是有一种方法可以设置默认值。 试试:

    int *arr = new int[SIZE]() ;
    

    以上是 C++ 标准,但可能不适用于所有编译器。安全的选择是使用循环并将其初始化为您选择的默认值。

    for(int i=0; i < SIZE; i++)
    {
      arr[i] = 1; //1 being my default value
    }
    

    编辑: 正如其他人指出的更好:memset

    【讨论】:

    • 值初始化如何依赖于编译器?
    • 我在 Borland 和 Dev C++ 编译器上尝试过一次,但初始化对 Borland 一直不起作用。
    • 值初始化是一个标准术语,将整数类型初始化为 0。如果编译器不支持它......好吧,它是一个糟糕的编译器。
    • @LuchianGrigore 确定当您知道一个流行的编译器无法正常工作时,很高兴告诉它。我们用真正的编译器编译而不是标准。
    • Borland 和 DevC++ 太老了,而且是标准之前的版本,以至于它们的输出完全不相关。
    【解决方案4】:

    它们将是未定义的。只是垃圾,具体取决于初始化之前这些位置的内容

    【讨论】:

      【解决方案5】:

      如果你写

      int *array = new int[50];
      

      那么数组中的值可以包含任何东西,但如果你写

      int *array = new int[50]();
      

      然后你将调用“默认构造函数”,一切都将是 0。

      【讨论】:

        【解决方案6】:

        它们更近,它们包含分配之前的所有数据。

        【讨论】:

          【解决方案7】:

          在 C/C++ 中,在内存中分配一个对象意味着简单地为该对象保留一些内存块。 初始值基本上是那些块中存在的大部分时间随机值。

          【讨论】:

            【解决方案8】:

            您需要假设它是垃圾,即使它可能经常(尤其是在调试版本中)被初始化为零或其他一些预定义的值,指示未初始化的内存(如果不使用零,通常是一些 HexSpeak 值)。

            例如见http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

            【讨论】:

              【解决方案9】:

              标准完全没有定义它,实际上只取决于您的操作系统和编译器。在一些编译器中,它只是使用操作系统给你的任何东西,而在一些操作系统中,它会是 0,其他是垃圾,还有一些是其他东西。或者编译器可以在mallocnew 之后自动插入一个不可见的memset。但无论如何,重点是,永远不要依赖价值。即使您当前版本的编译器将其设为 0,例如,这可能会在未来版本中发生变化,并且在另一个编译器上可能不会如此。

              【讨论】:

                猜你喜欢
                • 2015-11-08
                • 2014-10-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-02-18
                • 1970-01-01
                相关资源
                最近更新 更多