Использование удалит с причиной указателя базового класса утечку памяти?

Учитывая два класса имеют только примитивный тип данных и никакой пользовательский destructor/deallocator. Спецификация C++ гарантирует, что освободит с корректным размером?

struct A { int foo; };
struct B: public A { int bar[100000]; };
A *a = (A*)new B;
delete a;

Я хочу знать, делают я должен записать пустое virtual dtor?

Я попробовал g ++ и vc ++ 2008, и они не вызовут утечку. Но я хотел бы знать то, что корректно в стандарте C++.

18
задан Unihedron 11 August 2014 в 06:10
поделиться

5 ответов

Если неразрушитель базового класса не является виртуальным, это неопределенное поведение. См. 5.3.5 / 4:

Если статический тип операнда [оператора удаления] отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь Виртуальный деструктор или поведение не определено.

24
ответ дан 30 November 2019 в 06:59
поделиться

Хранение паролей в файлах cookie небезопасно, поскольку они доступны в виде обычного текста. но если вы предпочитаете, чтобы сделать это, или есть какие-либо требования пользователя, вы можете сделать это, зашифровав последовательности. это может сделать это достаточно безопасным.

, но это не рекомендуется,

-121--978558-

Он будет освобожден с правильным размером, поскольку размер, подлежащий освобождению, является свойством полученной области памяти кучи (нет размера, передаваемого в free () -like functions!).

Однако d 'tor не вызывается. Если 'B' определяет деструктор или содержит какие-либо членов с нетривиальным деструктором, они не будут вызываться, вызывая потенциальную утечку памяти. Однако в образце кода это не так.

-121--2250608-

Это неопределенное поведение - может быть, все хорошо, может быть, что пойдет не так. Либо не делайте этого, либо поставьте в базовый класс виртуальный деструктор.

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

1
ответ дан 30 November 2019 в 06:59
поделиться

Для только примитивных данных я считаю, что все в порядке. Вы можете законно не хотеть не хотеть не затрачить стоимость V-таблица в этом случае. В противном случае виртуальный D'TOR определенно предпочтительнее.

1
ответ дан 30 November 2019 в 06:59
поделиться

Согласно стандарту C ++, то, что у вас есть неопределенное поведение - это может проявиться в качестве утечки, это может быть не для того, чтобы ваш код был правильным, вам нужен виртуальный деструктор.

Кроме того, вам не нужно, чтобы (а *) отлив. Всякий раз, когда вы оказываетесь, что используете актерский элемент C ++ в C ++ C ++, вы можете быть достаточно уверены, что либо оно неценно, либо ваш код неверно.

16
ответ дан 30 November 2019 в 06:59
поделиться

Когда-то... Энди :

enter image description here

-121--1536580-

В python:

>>> 1.0 / 10
0.10000000000000001

Объясните, как некоторые дроби не могут быть представлены точно в двоичном формате. Точно так же, как некоторые фракции (как 1/3) не могут быть представлены точно в основании 10.

-121--1358921-

Он будет освобожден с правильным размером, так как подлежащий освобождению размер является свойством полученной области памяти кучи (нет размера, передаваемого в free () -like функции!).

Однако d 'tor не вызывается. Если 'B' определяет деструктор или содержит какие-либо членов с нетривиальным деструктором, они не будут вызываться, вызывая потенциальную утечку памяти. Однако в образце кода это не так.

0
ответ дан 30 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: