Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по семантике языка

285
24 июля 2004 года
Romik
479 / / 24.11.2002
Здравствуйте Господа Хорошие. Есть ряд вопрос на которые хотелось бы получить ответы. Во-первых, у меня есть "сложный" класс (его поля есть объекты других моих классов). При вызове delete[] MyMainObj; должна освободиться память которая была выделена через MyMainObj=new TMyMainObj(). В конструкторе этого класса вызываються конструкторы классов членов-данных (т.е. некоторые поля обьявлены как TMyClass *field1; А у этого класса TMyClass соответственно тоже есть конструктор, который вызываеться в конструкоторе главного класса). При удалении обьекта главного класса (как я пологал), должен вызываться его деструктор, в котором удаляються всего его динамические (TMyClass *field1 ведь размещаеться в heap)поля. Но во время исполнения (при отладке) указатель на *field1 содержит ????. Вопрос, удалил ли его оператор delete[](или только удалил указатель на обьект) или мне всёже необходимо укаждого класса члена-данных определять метод Free() и вызвать его перед удалением обьекта главного класса. Дело в том что если я ставлю брякпоинт в ~TMyClass(); то он не срабатывает, вот у меня и закрались сомнения на этот счёт. Я знаю что delete[] гарантирует удаление всех элементов одномерного массива размещённого в куче, но гарантирует ли он удаление членов данных сложного типа (TMyClass) я не знаю. Если, из всего что я тут на катал, кто-нибудь догодался чего я хочу, то прошу ответить.
3
27 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Romik

Угу Сэр, только в конструкторе моего TMyMainClass создаються обьекты на которые указывают эти самые указатели


Надеюсь, вы понимаете, Сэр, что объекты сначала создаются, а потом уже на них указывают указатели. Т.е. сначала создаются объекты, а потом инициализируются указатели.


Цитата:
Originally posted by Romik

... Сэр, спасибо, но мне как раз нужен этот указатель что бы удалить обьект на который он указывает (я хотел это сделать в демтрукторе)


Так вчем проблема, Сэр? Указатели являются полями Вашего класса.


Цитата:
Originally posted by Romik

Так мне же нужно удалить объект на который указывает указатель


Так точно, Сэр.

Цитата:
Originally posted by Romik

Благодарен за совет, только тем и занимаюсь, но я ожидал что в деструторе указатели ещё живы, а оказываеться-нет.


В деструкторе живы и указатели и объекты на которые они указывают, если, конечно вы не удалили объекты из вне до этого.

Пример:

Код:
#include <stdio.h>

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;
}
3
25 июля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Romik
Во-первых, у меня есть "сложный" класс (его поля есть объекты других моих классов).


Ничего сложного в твоем классе нет.
Кстати, это называется "агрегация".

Цитата:
Originally posted by Romik
При вызове delete[] MyMainObj; должна освободиться память которая была выделена через MyMainObj=new TMyMainObj().


Ошибка. Объект должен быть уничтожен так:
delete MyMainObj;
т.е. без кв. скобочек.

Цитата:
Originally posted by Romik

В конструкторе этого класса вызываються конструкторы классов членов-данных (т.е. некоторые поля обьявлены как TMyClass *field1;


Членами в данном случае являются не экземпляры классов, а указатели. Это большая разница.

Цитата:
Originally posted by Romik

А у этого класса TMyClass соответственно тоже есть конструктор, который вызываеться в конструкоторе главного класса). При удалении обьекта главного класса (как я пологал), должен вызываться его деструктор, в котором удаляються всего его динамические (TMyClass *field1 ведь размещаеться в heap)поля. Но во время исполнения (при отладке) указатель на *field1 содержит ????. Вопрос, удалил ли его оператор delete[](или только удалил указатель на обьект)


Будет удален только тот объект, который является полем класса, т.е. TMyClass *field1.
То на что указывает указатель, удалено не будет, это глупо. Ведь не уничтожается же город в случае сноса указателя на дороге.
Удаление объекта, на который указывает указатель (обычный, не auto_ptr) - задача программиста.

Цитата:
Originally posted by Romik

или мне всёже необходимо укаждого класса члена-данных определять метод Free() и вызвать его перед удалением обьекта главного класса.


А зачем? Вызывай delete field1; в деструкторе класса TMyMainObj

Цитата:
Originally posted by Romik

Я знаю что delete[] гарантирует удаление всех элементов одномерного массива размещённого в куче, но гарантирует ли он удаление членов данных сложного типа (TMyClass) я не знаю.


Советую почитать что-нибудь по С++, т.к. твой вопрос относится к базовым азам языка.

285
27 июля 2004 года
Romik
479 / / 24.11.2002
Цитата:

Членами в данном случае являются не экземпляры классов, а указатели. Это большая разница.


Угу Сэр, только в конструкторе моего TMyMainClass создаються обьекты на которые указывают эти самые указатели

Цитата:

Будет удален только тот объект, который является полем класса, т.е. TMyClass *field1.
То на что указывает указатель, удалено не будет, это глупо. Ведь не уничтожается же город в случае сноса указателя на дороге.
Удаление объекта, на который указывает указатель (обычный, не auto_ptr) - задача программиста.


... Сэр, спасибо, но мне как раз нужен этот указатель что бы удалить обьект на который он указывает (я хотел это сделать в демтрукторе)

Цитата:

А зачем? Вызывай delete field1; в деструкторе класса TMyMainObj



Так мне же нужно удалить объект на который указывает указатель

Цитата:

Советую почитать что-нибудь по С++, т.к. твой вопрос относится к базовым азам языка.


Благодарен за совет, только тем и занимаюсь, но я ожидал что в деструторе указатели ещё живы, а оказываеться-нет.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог