创建一个对象: 有或没有“新”

可能的复制品:
使用 new 和不使用 实例化对象有什么区别

这可能是一个基本的问题,可能已经有人问过了(比如说 给你) ,但我还是不明白。那么,让我来问问。

考虑下面的 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) ?

哪一个更好?

258747 次浏览

两者都做不同的事情。

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

第二种方法使用 动态存储时间动态存储时间创建一个对象,允许两种情况:

  • 对对象的生存期进行精细控制,因为它不会自动超出范围; 必须使用关键字 delete显式地销毁它;

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

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

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

你的 C + + 书应该很好地涵盖了这一点。如果你没有一个,别再往前走了直到你已经买和阅读,几次,这个

祝你好运。


您的原始代码被破坏了,因为它使用了一个不是 newchar数组。事实上,没什么newd 是 C 样式的字符串; 它来自字符串文字。deleteing 是一个错误(尽管它不会产生编译错误,而是在运行时产生不可预测的行为)。

通常一个对象不应该承担 deleteing 任何它本身不承担的责任。这种行为应该被很好地记录下来。在这种情况下,规则完全被打破了。

第一种方法分配一个具有自动存储持续时间的对象,这意味着它将在从定义它的作用域退出时被自动销毁。

第二种方法分配一个具有动态存储持续时间的对象,这意味着在显式使用 delete进行销毁之前不会销毁该对象。