memberOfA
и memberOfB
освобождается только если поставить delete[]
в destrutors из classA
и classB
. Так что, если бы вы написали деструктор classA
так, чтобы он освободил память, на которую указует memberOfA
, как это:
classA::~classA() {
delete [] memberOfA;
}
В этом случае деструктор освободит массив призывающего деструкторы элементов указываемых записей в memberOfA
, То же самое можно сказать и о деструктор classB
:
classB::~classB() {
delete [] memberOfB;
}
Помните, используя new
должны быть в паре с последующим delete
в какой-то момент, если не вы посмотрите на утечки. Возможно, вам стоит рассмотреть один из классов интеллектуальных указателей: unique_ptr
и shared_ptr
.
Если конструкция позволяет classA
и classB
использовать unique_ptr
или shared_ptr
в массив, большая часть опасностей утечки были бы преодолены:
std::unique_ptr<classB[]> memberOfA(new classB[10]);
Если порядок удаления представляет интерес для вас тогда вызов delete ptrA
приведет к вызову деструктора classA
, и если мы предположим, что он реализован как намеченный выше (с использованием delete []
), то оператор delete []
вызовет деструкторы всех членов в порядке убывания адреса, из Стандарта, проект N3690, § 5.3.5/6:
Если значение операнда удаления-выражения не нулевое значение указателя, удаления выражение будет вызывать деструктор (если таковые имеются) для объекта или элементы массива удаляется , В случае массива элементы будут уничтожены в порядке убывания адреса (то есть в обратном порядке завершения их конструктора, см. 12.6.2).
Это, конечно, приводят к деструктору classB
вызывается для каждого элемента, который будет снова использовать delete [] memberOfB
, который будет освободить массив, указывающий на целые числа.
Это не будет; Это ваша работа в деструкторах :) Это одна из главных причин популярности виртуальных машин с сборкой мусора, такой как Java и .NET. – racraman
Yeap, а затем вы превысите лимит накладных расходов GC, и вы находитесь в недействительном состоянии, вернитесь к основам! – g24l
Это не будет; не из-за недостающих деструкторов, а потому, что вы используете ** raw указатели ** для _manage_ памяти. – emlai