创build一个对象:有或没有`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 ("Hi\n"); 

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

为什么前者调用析构函数,但后者不(没有明确的调用destroy )?

哪一个是首选?

两者都做不同的事情。

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

第二个创build一个dynamic存储持续时间的对象,并允许两件事情:

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

  • 创build只有在运行时才知道大小的数组,因为在运行时创build对象。 (我不会在这里讨论分配dynamic数组的细节。)

两者都不是优选的; 这取决于你在做什么,哪一个是最合适的。

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

你的C ++书应该覆盖这很好。 如果你没有一个,直到你买了几次, 其中一个 。

祝你好运。


你原来的代码被破坏了,因为它delete一个新的char数组。 其实Cstring并没有什么 new , 它来自一个string文字。 delete这是一个错误(虽然这不会产生一个编译错误,而是在运行时不可预知的行为)。

通常一个对象不应该delete它本身不是new任何东西。 这种行为应该是有据可查的。 在这种情况下,规则正在被彻底打破。

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

第二个分配一个dynamic存储持续时间的对象,这意味着它不会被破坏,直到你明确地使用delete来这样做。