Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чистка памяти из -


Автор: Rickert 30.10.2008, 07:23
Код

class demoCls
{
  public:
    demoCls() {uno = 5;}

  private
    int uno;
};
void main()
{
  demoCls* i = new demoCls[200];
  void* p = (void*)i;

  delete [] p;
}

Теперь вопрос: такая чистка неверна и почему? По сути не будет вызван декструктор объектов. Почему ещё?
Если я сделаю так:
Код
class demoCls
{
  public:
    demoCls() {uno = 5;}

  private
    int uno;
};
void main()
{
  demoCls* i = new demoCls[200];
  void* p = (void*)i;

  demoCls* i2 = (demoCls*)p;

  delete [] i2;
}

То будет ли всё в порядке, правильно ли произойдёт удаление памяти?

Автор: Lazin 30.10.2008, 09:06
Цитата(Rickert @  30.10.2008,  07:23 Найти цитируемый пост)
class demoCls
{
  public:
    demoCls() {uno = 5;}
  private
    int uno;
};

пользуйся списками инициализации в конструкторе
Код

class demoCls
{
  public:
    demoCls() : uno(5) {}
  private
    int uno;
};

по сабжу, если нужно работать с памятью не типизировано, то можно использовать malloc и размещающий оператор new.
деструкторы во втором случае вызваны будут, в первом - нет smile 

Автор: Rickert 30.10.2008, 09:23
А ещё какие подводные камни во втором случае?

Автор: Lazin 30.10.2008, 09:37
в принципе никаких, если не считать плохого дизайна... указатели на void не должны так использоваться, есть много способов это обойти

Автор: Rickert 30.10.2008, 10:18
Дизайн не стар, а попахивает Си. Но это не относится к сути сабжа smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)