Создание объекта: с или без `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++ должна охватывать это довольно хорошо. Если у вас его нет,дальше не пойдет пока вы не купили и не прочитали, несколько раз,один из этих.
удачи.
ваш исходный код сломан, так как он delete
s a char
массив, что это не new
. На самом деле,ничего new
D строка в стиле C; она пришла из строкового литерала. delete
ing это ошибка (хотя и тот, который не будет генерировать ошибку компиляции, но вместо этого непредсказуемое поведение во время выполнения).
обычно объект не должен нести ответственность delete
ing все, что он не сам new
. Такое поведение должно быть хорошо задокументировано. В этом случае правило полностью нарушается.
первый выделяет объект с автоматической продолжительностью хранения, что означает, что он будет автоматически уничтожен при выходе из области, в которой он определен.
Второй выделил объект с динамической длительностью хранения, что означает, что он не будет уничтожен, пока вы явно не используете delete
сделать это.