Я не понимаю одну вещь. Например, я объявляю класс А и класс В, который является потомком A:C++ динамические объекты. Как определяется размер объекта во время выполнения?
class A {
public:
int a;
}
class B : public A {
public:
int b;
}
Очевидно, что если я создаю экземпляры А или В, их размер в памяти можно определить по типу.
A instanceA; // size of this will probably be the size of int (property a)
B instanceB; // size of this will probably be twice the size of int (properties a and b)
Но что делать, если я создаю динамические экземпляры, а затем освобожу их позже?
A * instanceAPointer = new A();
A * instanceBPointer = new B();
Они являются экземплярами различных классов, но программа будет рассматривать их как экземпляры класса А. Это хорошо при их использовании, но что об освобождении их? Чтобы освободить выделенную память, программа должна знать размер свободной памяти, не так ли?
Так что, если я пишу
delete instanceAPointer;
delete isntanceBPointer;
Как знать, программа, сколько памяти, начиная с адреса каждый указатель, указывающий на, он должен освободить? Поскольку очевидно, что объекты имеют разный размер, но программа считает их типа А.
Благодаря
Возможно, эта ссылка поможет? http://www.openrce.org/articles/files/jangrayhood.pdf – OldProgrammer
На самом деле, похоже, что второй может вызвать утечку памяти, поскольку это не полиморфный класс. Если класс является полиморфным, компилятор может освободить его на основе динамического типа, используя RTTI или какой-либо другой метод, и автоматически освобождает тот же объем памяти, который был фактически выделен. Если класс не является полиморфным, я не верю, что он сможет правильно обработать эту ситуацию, поэтому вы всегда должны удалять его с помощью указателя правильного типа. –
@JustinTime По полиморфному классу вы имеете в виду класс с виртуальным деструктором? –