创建一个对象:带或不带`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来这样做。

    链接地址: http://www.djcxy.com/p/79111.html

    上一篇: Creating an object: with or without `new`

    下一篇: (C++) Memory on the heap becoming in accessable/being deleted