创建一个对象:有或没有`new`

时间:2011-06-13 22:47:25

标签: c++ constructor new-operator destructor

  

可能重复:
  What is difference between instantiating an object using new vs. without

这可能是一个基本问题,可能已经被问到(例如here);但我还是不明白。所以,让我问一下。

考虑以下C ++类:

class Obj{
    char* str;
public:
    Obj(char* s){
        str = s;
        cout << str;
    }
    ~Obj(){
        cout << "Done!\n";
        delete str;        // See the comment of "Loki Astari" below on why this line of code is bad practice
    }
};

以下代码段之间的区别是什么:

Obj o1 ("Hi\n");

Obj* o2 = new Obj("Hi\n");

为什么前者调用析构函数,但后者不调用(没有显式调用delete)?

哪一个更受欢迎?

2 个答案:

答案 0 :(得分:136)

两者做不同的事情。

第一个创建一个自动存储持续时间的对象。当前块({ ... })结束时,它会被创建,使用,然后超出范围。这是创建对象的最简单方法,与编写int x = 0;时的方式相同

第二个创建一个具有动态存储持续时间的对象,并允许两件事:

  • 精确控制对象的生命周期,因为它不会自动超出范围;您必须使用关键字delete;

  • 明确销毁它
  • 创建仅在运行时已知大小的数组,因为对象创建在运行时进行。 (我不会在这里讨论分配动态数组的细节。)

两者都不是首选;这取决于你在做什么是最合适的。

使用前者,除非您需要使用后者。

你的C ++书应该很好地涵盖了这一点。如果您没有,不再进一步,直到您多次购买和阅读one of these

祝你好运。


您的原始代码已损坏,因为deletechar数组,但它没有new。事实上, nothing new是C风格的字符串;它来自一个字符串文字。 delete这是一个错误(虽然不会产生编译错误,但在运行时会产生不可预测的行为)。

通常一个对象不应该delete任何它本身不是new的东西。{1}}。这种行为应该有详细记录。在这种情况下,规则完全被打破。

答案 1 :(得分:19)

第一个分配一个具有自动存储持续时间的对象,这意味着它将在退出定义它的范围时自动销毁。

第二个分配了一个具有动态存储持续时间的对象,这意味着在明确使用delete之前,它不会被破坏。