вызывает ли компилятор неявный деструктор для объекта, инициализированного новым - PullRequest
0 голосов
/ 31 мая 2018

У меня есть сомнения, так как компилятор C ++ (GNU g ++) вызывает неявный d-тор с объектами в стеке.когда он вызывает d-tor для объекта, где память - выделена новой.

struct abc{
   int a;
};

int main(){
 {
     abc ob1;
 }//! Here implicit ~abc() will be called

 {
 abc *ob2 = new abc();
 } //! Will comipler call d-tor for ob2 ?

 return 0;
}

Пожалуйста, помогите мне узнать, если компилятор не освобождает память * ob2, тогда почему он так поступает?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

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

Если, однако, вы используете смарт-указатель, он будеточищаться, когда он покидает область видимости:

{
    std::unique_ptr<abc> ob2( new abc() );
}

unique_ptr автоматически вызовет delete для «собственного» объекта, когда ob2 покидает область видимости.

OfКонечно, вы должны действительно использовать make_unique вместо явного вызова new, и это также хорошее место для использования C ++ 11 auto:

{
    auto ob2 = make_unique<abc>();
}

См. Умные указатели (Современный C ++)

В целом, в Modern C ++ вам не следует явно вызывать delete в большинстве случаев.См. C ++ Core Guidelines и, в частности:

C.149: Используйте unique_ptr или shared_ptr, чтобы не забывать удалять объекты, созданные с использованием новых

R.11: Избегать вызова новых и удалять явно

ES.60: Избегать новых и удалять внешние функции управления ресурсами

0 голосов
/ 31 мая 2018

Нет.Вы должны вызвать delete для объекта.

Если вы динамически создаете объект в C ++ (неуправляемый язык), вы должны вызвать delete для объекта, чтобы освободить память в куче.

Вызов delete для указателя на объект вызовет деструктор удаляемого объекта.

...