Здравствуйте, chem, Вы писали:
C>Здравствуйте, Аноним, Вы писали:
А>>Но остается вопрос, нужно ли этот непроинициализировавшийся класс удалять, например delete something; А>>(класс создавался динамически)?
C>При появлении таких вопросов лучшее место для поиска ответа — стандарт. Вот чего пишет наш ISO/IEC 14882 в пункте 15.2, второй абзац (выделение мое):
C>
C>An object that is partially constructed or partially destroyed will have destructors executed for all of its fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and the destructor has not yet begun execution. Should a constructor for an element of an automatic array throw an exception, only the constructed elements of that array will be destroyed. If the object or array was allocated in a new-expression, the matching deallocation function (3.7.3.2, 5.3.4, 12.5), if any, is called to free the storage occupied by the object.
C>Т.е. при исключении в конструкторе память будет освобождена автоматически.
опять же, если только не была выделена память (или любые _другие_ ресурсы) в конструкторе ДО исключения. например:
Здравствуйте, Aera, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>кслову сказать имено потому то А>>delete 0; А>>ни чего не делает и является безопасным.
A>стандартный "delete 0" ничего не делает, потому что Microsoft что-то там переделала в своей реализации CRT?
безопасное удаление нулевого указателя это стандард если не ошибаюсь, потому как new (std::nothrow) — это тоже стандард.
вобщем при вызове new всегда нужно быть готовым и к 0 и к эксепшину. эксепшн может быть в любом случае и з конструктора, а 0 — завит от реализации и настроек.
Здравствуйте, Аноним, Вы писали:
C>>Здравствуйте, Аноним, Вы писали:
А>>>Но остается вопрос, нужно ли этот непроинициализировавшийся класс удалять, например delete something; А>>>(класс создавался динамически)?
C>>Т.е. при исключении в конструкторе память будет освобождена автоматически.
А>опять же, если только не была выделена память (или любые _другие_ ресурсы) в конструкторе ДО исключения. например:
//skipped
А>aaa — НЕ освободится.
Как я понял, спрашивалось насчет памяти, выделенной под объект, конструктор которого кидает исключение. Естественно, что aaa в Вашем примере не освободится.
Re[9]: как остановить создание класса
От:
Аноним
Дата:
08.09.06 10:05
Оценка:
Здравствуйте, chem, Вы писали:
C>Здравствуйте, Аноним, Вы писали:
C>>>Здравствуйте, Аноним, Вы писали:
А>>>>Но остается вопрос, нужно ли этот непроинициализировавшийся класс удалять, например delete something; А>>>>(класс создавался динамически)?
C>>>Т.е. при исключении в конструкторе память будет освобождена автоматически.
А>>опять же, если только не была выделена память (или любые _другие_ ресурсы) в конструкторе ДО исключения. например:
C>
C>//skipped
C>
А>>aaa — НЕ освободится.
C>Как я понял, спрашивалось насчет памяти, выделенной под объект, конструктор которого кидает исключение. Естественно, что aaa в Вашем примере не освободится.
я просто привел очень простой пример к чему нужно быть готовым. в этом примере именно из конструктора исключение и кидается, но вся память не освобождается. все это может быть на много сложнее. просто надо иметь ввиду, что деструктор в этом случае не вызывается и помнить об этом при написании конструктора.
Здравствуйте, Аноним, Вы писали:
А>вобщем при вызове new всегда нужно быть готовым и к 0 и к эксепшину. эксепшн может быть в любом случае и з конструктора, а 0 — завит от реализации и настроек.
Добавим в скобках: при работе на компиляторах, которые допускают в этом случае несоответствие стандарту — VC++.
A>>стандартный "delete 0" ничего не делает, потому что Microsoft что-то там переделала в своей реализации CRT?
А>безопасное удаление нулевого указателя это стандард если не ошибаюсь, потому как new (std::nothrow) — это тоже стандард.
+1
А>вобщем при вызове new всегда нужно быть готовым и к 0 и к эксепшину. эксепшн может быть в любом случае и з конструктора, а 0 — завит от реализации и настроек.
Не совсем так — если для соотв. operator new не был указан пустой exception-specification, то при сбое в выделении памяти он кидает bad_alloc, а если был указан пустой ( throw() ) — то возвращает null.
Re[11]: как остановить создание класса
От:
Аноним
Дата:
08.09.06 14:56
Оценка:
Здравствуйте, chem, Вы писали:
C>Здравствуйте, Аноним, Вы писали:
A>>>стандартный "delete 0" ничего не делает, потому что Microsoft что-то там переделала в своей реализации CRT?
А>>безопасное удаление нулевого указателя это стандард если не ошибаюсь, потому как new (std::nothrow) — это тоже стандард.
C>+1
А>>вобщем при вызове new всегда нужно быть готовым и к 0 и к эксепшину. эксепшн может быть в любом случае и з конструктора, а 0 — завит от реализации и настроек.
C>Не совсем так — если для соотв. operator new не был указан пустой exception-specification, то при сбое в выделении памяти он кидает bad_alloc, а если был указан пустой ( throw() ) — то возвращает null.
а еще операция new может быть переопределена. но за это по-моему руки отрывать нужно...