Вопрос по семантике языка
Угу Сэр, только в конструкторе моего TMyMainClass создаються обьекты на которые указывают эти самые указатели
Надеюсь, вы понимаете, Сэр, что объекты сначала создаются, а потом уже на них указывают указатели. Т.е. сначала создаются объекты, а потом инициализируются указатели.
... Сэр, спасибо, но мне как раз нужен этот указатель что бы удалить обьект на который он указывает (я хотел это сделать в демтрукторе)
Так вчем проблема, Сэр? Указатели являются полями Вашего класса.
Так мне же нужно удалить объект на который указывает указатель
Так точно, Сэр.
Благодарен за совет, только тем и занимаюсь, но я ожидал что в деструторе указатели ещё живы, а оказываеться-нет.
В деструкторе живы и указатели и объекты на которые они указывают, если, конечно вы не удалили объекты из вне до этого.
Пример:
class TMyClass
{
public:
TMyClass()
{ printf("TMyClass Constructor\n"); }
~TMyClass()
{ printf("TMyClass Destructor\n"); }
};
class TMyMainObj
{
TMyClass *field1;
public:
TMyMainObj()
{
printf("TMyMainObj Constructor\n");
field1 = new TMyClass;
}
~TMyMainObj()
{
printf("TMyMainObj Destructor\n");
delete field1;
}
};
int main()
{
TMyMainObj MyMainObj = TMyMainObj;
delete MyMainObj;
return 1;
}
Во-первых, у меня есть "сложный" класс (его поля есть объекты других моих классов).
Ничего сложного в твоем классе нет.
Кстати, это называется "агрегация".
При вызове delete[] MyMainObj; должна освободиться память которая была выделена через MyMainObj=new TMyMainObj().
Ошибка. Объект должен быть уничтожен так:
delete MyMainObj;
т.е. без кв. скобочек.
В конструкторе этого класса вызываються конструкторы классов членов-данных (т.е. некоторые поля обьявлены как TMyClass *field1;
Членами в данном случае являются не экземпляры классов, а указатели. Это большая разница.
А у этого класса TMyClass соответственно тоже есть конструктор, который вызываеться в конструкоторе главного класса). При удалении обьекта главного класса (как я пологал), должен вызываться его деструктор, в котором удаляються всего его динамические (TMyClass *field1 ведь размещаеться в heap)поля. Но во время исполнения (при отладке) указатель на *field1 содержит ????. Вопрос, удалил ли его оператор delete[](или только удалил указатель на обьект)
Будет удален только тот объект, который является полем класса, т.е. TMyClass *field1.
То на что указывает указатель, удалено не будет, это глупо. Ведь не уничтожается же город в случае сноса указателя на дороге.
Удаление объекта, на который указывает указатель (обычный, не auto_ptr) - задача программиста.
или мне всёже необходимо укаждого класса члена-данных определять метод Free() и вызвать его перед удалением обьекта главного класса.
А зачем? Вызывай delete field1; в деструкторе класса TMyMainObj
Я знаю что delete[] гарантирует удаление всех элементов одномерного массива размещённого в куче, но гарантирует ли он удаление членов данных сложного типа (TMyClass) я не знаю.
Советую почитать что-нибудь по С++, т.к. твой вопрос относится к базовым азам языка.
Членами в данном случае являются не экземпляры классов, а указатели. Это большая разница.
Угу Сэр, только в конструкторе моего TMyMainClass создаються обьекты на которые указывают эти самые указатели
Будет удален только тот объект, который является полем класса, т.е. TMyClass *field1.
То на что указывает указатель, удалено не будет, это глупо. Ведь не уничтожается же город в случае сноса указателя на дороге.
Удаление объекта, на который указывает указатель (обычный, не auto_ptr) - задача программиста.
... Сэр, спасибо, но мне как раз нужен этот указатель что бы удалить обьект на который он указывает (я хотел это сделать в демтрукторе)
А зачем? Вызывай delete field1; в деструкторе класса TMyMainObj
Так мне же нужно удалить объект на который указывает указатель
Советую почитать что-нибудь по С++, т.к. твой вопрос относится к базовым азам языка.
Благодарен за совет, только тем и занимаюсь, но я ожидал что в деструторе указатели ещё живы, а оказываеться-нет.