可能重复:
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
)?
哪一个更受欢迎?
答案 0 :(得分:136)
两者做不同的事情。
第一个创建一个自动存储持续时间的对象。当前块({ ... }
)结束时,它会被创建,使用,然后超出范围。这是创建对象的最简单方法,与编写int x = 0;
时的方式相同
第二个创建一个具有动态存储持续时间的对象,并允许两件事:
精确控制对象的生命周期,因为它不会自动超出范围;您必须使用关键字delete
;
创建仅在运行时已知大小的数组,因为对象创建在运行时进行。 (我不会在这里讨论分配动态数组的细节。)
两者都不是首选;这取决于你在做什么是最合适的。
使用前者,除非您需要使用后者。
你的C ++书应该很好地涵盖了这一点。如果您没有,不再进一步,直到您多次购买和阅读one of these。
祝你好运。您的原始代码已损坏,因为delete
是char
数组,但它没有new
。事实上, nothing new
是C风格的字符串;它来自一个字符串文字。 delete
这是一个错误(虽然不会产生编译错误,但在运行时会产生不可预测的行为)。
通常一个对象不应该delete
任何它本身不是new
的东西。{1}}。这种行为应该有详细记录。在这种情况下,规则完全被打破。
答案 1 :(得分:19)
第一个分配一个具有自动存储持续时间的对象,这意味着它将在退出定义它的范围时自动销毁。
第二个分配了一个具有动态存储持续时间的对象,这意味着在明确使用delete
之前,它不会被破坏。