创建一个对象:带或不带`new`
可能重复:
使用new和without实例化对象有什么区别
这可能是一个基本问题,可能已经被问到(比如说)。 但我仍然不明白。 所以,让我问一下。
考虑下面的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 ("Hin");
和
Obj* o2 = new Obj("Hin");
为什么前者调用析构函数,但后者没有(没有明确的调用delete
)?
哪一个是首选?
两者都做不同的事情。
第一个创建一个自动存储持续时间的对象。 它在当前块( { ... }
)结束时被创建,使用,然后超出范围。 这是创建对象的最简单方法,并且与编写int x = 0;
时的方法相同int x = 0;
第二个创建一个具有动态存储持续时间的对象,并允许两件事:
精确控制对象的生命周期,因为它不会自动超出范围; 您必须使用关键字delete
将其明确销毁;
创建仅在运行时才知道大小的数组,因为对象创建在运行时发生。 (我不会详细讨论在这里分配动态数组的细节。)
两者都不是优选的; 这取决于你在做什么,哪一个最合适。
使用前者,除非你需要使用后者。
你的C ++书应该涵盖这一点。 如果你没有一个,直到你买了几次,其中一个,然后再去阅读。
祝你好运。
您的原始代码已损坏,因为它delete
了不是new
char
数组。 事实上,没有什么new
的C风格的字符串; 它来自一个字符串文字。 delete
这是一个错误(虽然不会产生编译错误,但在运行时却不可预知的行为)。
通常,对象不应该delete
它本身不是new
任何东西。 这种行为应该是有据可查的。 在这种情况下,规则正在被彻底打破。
第一个分配一个具有自动存储持续时间的对象,这意味着它将在退出它定义的范围时自动被破坏。
第二个分配一个动态存储持续时间的对象,这意味着它不会被破坏,直到你明确使用delete
来这样做。
上一篇: Creating an object: with or without `new`
下一篇: (C++) Memory on the heap becoming in accessable/being deleted