如何用C ++中的新运算符初始化内存?

我刚刚开始进入C ++,我想要选择一些良好的习惯。 如果我刚刚为new运算符分配了一个int类型的数组,我怎样才能将它们全部初始化为0而无需自己循环遍历它们? 我应该只使用memset吗? 有没有“C ++”的方式来做到这一点?


这是C ++的一个令人惊讶的鲜为人知的特性(就像没有人给出这个答案一样),但它实际上有特殊的语法来默认初始化一个数组(在技术上,它被称为“value-初始化“):

new int[10]();

请注意,您必须使用空括号 - 例如,您不能使用(0)或任何其他表达式(这就是为什么这仅用于默认初始化)。

这是ISO C ++ 03 5.3.4 [expr.new] / 15明确允许的,它表示:

创建类型为T的对象的新表达式按如下方式初始化该对象:

...

  • 如果new-initializer是form(),则该项目被初始化(8.5);
  • 并且不限制允许这种类型的类型,而(expression-list)形式被同一节中的其他规则明确地限制,使得它不允许数组类型。


    假设你真的想要一个数组而不是一个std :: vector,那么“C ++方式”就是这样

    #include <algorithm> 
    
    int* array = new int[n]; // Assuming "n" is a pre-existing variable
    
    std::fill_n(array, n, 0); 
    

    但请注意,在实际情况下,这实际上仍然是一个循环,将每个元素赋值为0(实际上没有其他方法可以执行此操作,除非具有硬件级支持的特殊架构)。


    有很多方法来分配一个内部类型的数组,但所有这些方法都是正确的,但哪一个可以选择,取决于...

    手动初始化循环中的所有元素

    int* p = new int[10];
    for (int i = 0; i < 10; i++)
    {
        p[i] = 0;
    }
    

    使用<cstring> std::memset函数

    int* p = new int[10];
    std::memset(p, 0, 10);
    

    使用<algorithm> std::fill_n算法

    int* p = new int[10];
    std::fill_n(p, 10, 0);
    

    使用std::vector容器

    std::vector<int> v(10); // elements zero'ed
    

    如果C ++ 0x可用,则使用初始化器列表功能

    int a[] = { 1, 2, 3 }; // 3-element static size array
    vector<int> v = { 1, 2, 3 }; // 3-element array but vector is resizeable in runtime
    
    链接地址: http://www.djcxy.com/p/13755.html

    上一篇: How to initialise memory with new operator in C++?

    下一篇: How to convert string to lowercase in Python