可能的重复:
使用 new 实例化对象与不使用 new 实例化对象有什么区别
这可能是一个基本问题,并且可能已经被问过(例如,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");
and
Obj* o2 = new Obj("Hi\n");
为什么前者调用析构函数,而后者不调用析构函数(没有显式调用delete
)?
哪一个是首选?
两者都做不同的事情。
第一个创建一个对象自动存储时长。它被创建、使用,然后在当前块 ({ ... }
)结束。这是创建对象的最简单方法,与编写时一样int x = 0;
第二个创建一个对象动态存储持续时间并允许两件事:
两者都不是优选的;这取决于您正在做什么,哪一个最合适。
除非需要使用后者,否则请使用前者。
你的 C++ 书籍应该很好地介绍了这一点。如果你没有的话,别再走了直到你购买并阅读多次,其中之一.
您的原始代码已损坏,因为它delete
s a char
数组它没有new
。实际上,nothing new
d C 风格字符串;它来自字符串文字。delete
这是一个错误(尽管不会生成编译错误,但会在运行时产生不可预测的行为)。
通常一个对象不应该承担以下责任:delete
ing 任何它本身没有的东西new
。这种行为应该有详细记录。在这种情况下,规则就被彻底打破了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)