Подтвердить что ты не робот

Создание объекта: с или без `new`

Возможный дубликат:
В чем разница между созданием экземпляра объекта с помощью нового vs. without

Это, вероятно, основной вопрос и, возможно, уже был задан (скажем, здесь); но я до сих пор этого не понимаю. Итак, позвольте мне спросить.

Рассмотрим следующий класс С++:

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");

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Удачи.


Исходный код поврежден, так как массив delete a char не имеет значения new. Фактически, ничего new d строка C-стиля; это произошло из строкового литерала. delete ing, который является ошибкой (хотя и не генерирует ошибку компиляции, а скорее непредсказуемым поведением во время выполнения).

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

Ответ 2

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

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