Создание объекта: с или без `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 ("Hin");

и

Obj* o2 = new Obj("Hin");

почему первый вызывает деструктор, но последний не делает (без явного вызова delete)?

какой из них предпочтительнее?

2 ответов


оба делают разные вещи.

первый создает объект с автоматическая длительность хранения. Он создается, используется, а затем выходит за рамки текущего блока ({ ... }) заканчивается. Это самый простой способ создать объект и такой же, как при записи int x = 0;

второй создает объект с динамическая память продолжительность и позволяет две вещи:

  • точный контроль над время жизни объекта, так как он не выходит из области автоматически; вы должны уничтожить его явно с помощью ключевого слова delete;

  • создание массивов с размером, известным только во время выполнения, так как создание объекта происходит во время выполнения. (Я не буду вдаваться в подробности выделения динамических массивов здесь.)

ни один из них не является предпочтительным; это зависит от того, что вы делаете относительно того, что наиболее подходит.

используйте прежний, если вам нужно использовать последнее.

ваша книга на C++ должна охватывать это довольно хорошо. Если у вас его нет,дальше не пойдет пока вы не купили и не прочитали, несколько раз,один из этих.

удачи.


ваш исходный код сломан, так как он deletes a char массив, что это не new. На самом деле,ничего newD строка в стиле C; она пришла из строкового литерала. deleteing это ошибка (хотя и тот, который не будет генерировать ошибку компиляции, но вместо этого непредсказуемое поведение во время выполнения).

обычно объект не должен нести ответственность deleteing все, что он не сам new. Такое поведение должно быть хорошо задокументировано. В этом случае правило полностью нарушается.


первый выделяет объект с автоматической продолжительностью хранения, что означает, что он будет автоматически уничтожен при выходе из области, в которой он определен.

Второй выделил объект с динамической длительностью хранения, что означает, что он не будет уничтожен, пока вы явно не используете delete сделать это.