【问题标题】:create new instance of a class without "new" operator创建没有“new”运算符的类的新实例
【发布时间】:2011-08-18 15:25:41
【问题描述】:

只是一个简单的问题。正如标题所示,我只使用“new”运算符来创建类的新实例,所以我想知道其他方法是什么以及如何正确使用它。

【问题讨论】:

    标签: c++ class


    【解决方案1】:

    你可以只声明一个普通变量:

    YourClass foo;
    

    【讨论】:

    • 假设它有一个默认的构造函数。
    • 在哪里可以找到有关“正常变量”的更多信息?
    【解决方案2】:

    您还可以拥有不使用new 的类的自动 实例,例如:

    class A{};
    
    //automatic 
    A a;             
    
    //using new
    A *pA = new A();
    
    //using malloc and placement-new
    A *pA = (A*)malloc(sizeof(A));
    pA = new (pA) A();
    
    //using ONLY placement-new
    char memory[sizeof(A)];
    A *pA = new (memory) A();
    

    最后两个使用placement-new,这与new略有不同。 Placement-new 用于通过调用构造函数来构造对象。在第三个例子中,malloc 只分配内存,不调用构造函数,所以使用 placement-new 调用构造函数来构造对象。

    还要注意如何删除内存。

      //when pA is created using new
      delete pA;
    
      //when pA is allocated memory using malloc, and constructed using placement-new
      pA->~A(); //call the destructor first
      free(pA); //then free the memory
    
      //when pA constructed using placement-new, and no malloc or new!
      pA->~A(); //just call the destructor, that's it!
    

    要了解什么是新展示位置,请阅读以下常见问题解答:

    【讨论】:

    • +1:我想知道非动态分配的正确术语是什么。 自动 - 谢谢!
    • 另外,要了解使用自动实例的优势,您需要了解RAII
    • auto 变量有时也称为stack 变量。到底有多少程序员实际使用auto 关键字?
    • 第三个示例并不总是有效,因为字符数组 memory 不能保证与 A 对象正确对齐。
    • @Loadmaster:正如我对现已删除的答案所评论的那样,调用自动变量堆栈变量在某些情况下可能是不正确的,例如当这样的变量是堆分配对象的成员时。
    【解决方案3】:

    使用 malloc 将得到与 new 相同的结果,只是无需调用构造函数。

    【讨论】:

    • 不是完全错误,所以没有-1...只有当构造函数什么都不做并且类没有任何虚方法时,这才是正确的...
    【解决方案4】:

    任何常用方式:作为局部变量或静态变量,或作为 一个临时的。一般来说,您在 C++ 中使用 new 的唯一时间是 当对象具有身份和生命周期时 对应一个范围,或者当它是多态的。 (有 例外,当然,但不多。)如果对象可以 复制,通常最好使用本地实例,复制 那些需要的。 (事实上​​,就像你对int 所做的那样。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多