Учитывая два класса имеют только примитивный тип данных и никакой пользовательский 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++.
Если неразрушитель базового класса не является виртуальным, это неопределенное поведение. См. 5.3.5 / 4:
Если статический тип операнда [оператора удаления] отличается от его динамического типа, статический тип должен быть базовым классом динамического типа операнда, а статический тип должен иметь Виртуальный деструктор или поведение не определено.
Хранение паролей в файлах cookie небезопасно, поскольку они доступны в виде обычного текста. но если вы предпочитаете, чтобы сделать это, или есть какие-либо требования пользователя, вы можете сделать это, зашифровав последовательности. это может сделать это достаточно безопасным.
, но это не рекомендуется,
-121--978558- Он будет освобожден с правильным размером, поскольку размер, подлежащий освобождению, является свойством полученной области памяти кучи (нет размера, передаваемого в free ()
-like functions!).
Однако d 'tor не вызывается. Если 'B' определяет деструктор или содержит какие-либо членов с нетривиальным деструктором, они не будут вызываться, вызывая потенциальную утечку памяти. Однако в образце кода это не так.
-121--2250608-Это неопределенное поведение - может быть, все хорошо, может быть, что пойдет не так. Либо не делайте этого, либо поставьте в базовый класс виртуальный деструктор.
В большинстве реализаций эта утечка не происходит - в классе нет функций-членов, выделенных в кучу, поэтому единственное, что необходимо при удалении
, - это освобождение памяти. При удалении памяти используется только адрес объекта, не более того, все остальное выполняет куча.
Для только примитивных данных я считаю, что все в порядке. Вы можете законно не хотеть не хотеть не затрачить стоимость V-таблица в этом случае. В противном случае виртуальный D'TOR определенно предпочтительнее.
Согласно стандарту C ++, то, что у вас есть неопределенное поведение - это может проявиться в качестве утечки, это может быть не для того, чтобы ваш код был правильным, вам нужен виртуальный деструктор.
Кроме того, вам не нужно, чтобы (а *) отлив. Всякий раз, когда вы оказываетесь, что используете актерский элемент C ++ в C ++ C ++, вы можете быть достаточно уверены, что либо оно неценно, либо ваш код неверно.
Когда-то... Энди :
-121--1536580-В python:
>>> 1.0 / 10
0.10000000000000001
Объясните, как некоторые дроби не могут быть представлены точно в двоичном формате. Точно так же, как некоторые фракции (как 1/3) не могут быть представлены точно в основании 10.
-121--1358921- Он будет освобожден с правильным размером, так как подлежащий освобождению размер является свойством полученной области памяти кучи (нет размера, передаваемого в free ()
-like функции!).
Однако d 'tor не вызывается. Если 'B' определяет деструктор или содержит какие-либо членов с нетривиальным деструктором, они не будут вызываться, вызывая потенциальную утечку памяти. Однако в образце кода это не так.