关于c ++:创建一个对象:有或没有`new`

Creating an object: with or without `new`

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is difference between instantiating an object using new vs. without

这可能是一个基本问题,可能已经被问过(比方说,这里); 但我还是不明白。 所以,让我问一下。

考虑以下C ++类:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Obj{
    char* str;
public:
    Obj(char* s){
        str = s;
        cout << str;
    }
    ~Obj(){
        cout <<"Done!
"
;
        delete str;        // See the comment of"Loki Astari" below on why this line of code is bad practice
    }
};

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

1
2
Obj o1 ("Hi
"
);

1
2
Obj* o2 = new Obj("Hi
"
);

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

哪一个更受欢迎?


两者都做不同的事情。

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

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

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

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

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

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

你的C ++书应该很好地涵盖了这一点。如果你没有,那么在你多次购买和阅读其中之一之前不要再进一步了。

祝好运。

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

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


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

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