Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильное удаление динамической структуры 
V
    Опции темы
Vetos
Дата 14.7.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Здравствуйте!
Существует класс:
Код

class gg
{
private:
     struct Vertex
      { float coords[3]; }
     
     Vertex * Vertices;
public:
     void New(int count);
     ~gg();
}

Далее так:
Код

void gg::New(int count);
{
     Vertices = new Vertex[count];
}

gg::~gg()
{
    delete[] Vertices;
}


Если создать один экземпляр то все работает норм, когда добавляю второй то при закрытии проги происходит ошибка не указывающая на код:
HEAP[OpenGL.exe]: Heap block at 02137DB0 modified at 02137DDC past requested size of 24
ОС Windows инициировала точку останова в OpenGL.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в OpenGL.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит OpenGL.exe

Странно это както, если убрать из деструктора удаление массива то ошибки не вылетают, но ведь это не выход:(
Кодю в VS 2008 C++
Спасибо.


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
zim22
Дата 14.7.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



конструктор добавьте
Код

gg() : Vertices(NULL) { }  

и в деструкторе на всякий случай строчку добавьте
Код

~gg() {
    delete[] Vertices;    
    Vertices = NULL;
  }


Это сообщение отредактировал(а) zim22 - 14.7.2009, 18:40


--------------------
PM MAIL   Вверх
Vetos
Дата 14.7.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Цитата

конструктор добавьте
1:gg() : Vertices(NULL) { }  

чот невыходит ничего ругается типа синтаксическая ошибка. Я так сделал - это так надо было сделать?:
Код

gg::gg()
{
Vertices(NULL){}
}



--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
azesmcar
Дата 14.7.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Vetos @  14.7.2009,  20:33 Найти цитируемый пост)
чот невыходит ничего ругается типа синтаксическая ошибка. Я так сделал - это так надо было сделать?:

Да... smile 

Цитата(Vetos @  14.7.2009,  20:33 Найти цитируемый пост)

gg() : Vertices(NULL) { }
 


Цитата(Vetos @  14.7.2009,  20:33 Найти цитируемый пост)

gg::gg()
{
Vertices(NULL){}
}

найди 1 отличие.
PM   Вверх
Vetos
Дата 14.7.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Цитата(azesmcar @  14.7.2009,  20:36 Найти цитируемый пост)
найди 1 отличие.

Блин ничо не пойму, где это написать:
Код

gg::gg()
{
 gg() : Vertices(NULL){}
}

так

Это сообщение отредактировал(а) Vetos - 14.7.2009, 20:44


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
ИванМ
Дата 14.7.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Vetos, либо
Код

gg() : Vertices(NULL) { }

пиши внутри класса
либо 
Код

gg::gg()
{
 Vertices=NULL;
}

вне класса (если сокращенная запись тебе так не нравится)
PM MAIL   Вверх
azesmcar
Дата 14.7.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(Vetos @  14.7.2009,  20:44 Найти цитируемый пост)
Блин ничо не пойму, где это написать:

а что тут понимать..написано же, просто скопируй.

PM   Вверх
Vetos
Дата 14.7.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Ясно, всеравно таже малина, при закрытии выбрасывает ошибку, что делать


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
ИванМ
Дата 14.7.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Код

~gg() 
{
  if(Vertices!=NULL)
  { 
    delete[] Vertices;    
    Vertices = NULL;
  } 
}

PM MAIL   Вверх
Vetos
Дата 14.7.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



ИванМ, Всеравно таже ошибка, когда экземпляр один все норм
Вернее даже, объявленных может быть несколько но если не вызывать gg.New тогда все норм

Это сообщение отредактировал(а) Vetos - 14.7.2009, 21:01


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
ИванМ
Дата 14.7.2009, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



Vetos, покажи полностью код, где ты работаешь с gg.
PM MAIL   Вверх
Vetos
Дата 14.7.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



ИванМ, gg это просто пример моего класса, в настоящем коде кучамала так что там очень долго разбираться.
Отрелизил я свой проект, завершилось всеравно с ошибкой, но когда запускаю и закрываю ехешник то винда ошибок не выкидывает, может это просто глюк в компиляторе.Ща попробую создать другой проект с похожим кодом, если ошибки не будет то буду копать, если будет то наверно дело в компиляторе.

Кстати для релиза ошибка поменялась, немного))
HEAP[OpenGL.exe]: Heap block at 02116D50 modified at 02116D59 past requested size of 1

Это сообщение отредактировал(а) Vetos - 14.7.2009, 21:23


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
zim22
Дата 14.7.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Vetos @  14.7.2009,  20:57 Найти цитируемый пост)
Всеравно таже ошибка, когда экземпляр один все норм

вы добавили мой конструктор?


--------------------
PM MAIL   Вверх
Vetos
Дата 14.7.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: нет
Всего: 4



Цитата(zim22 @  14.7.2009,  21:19 Найти цитируемый пост)
вы добавили мой конструктор?

Да


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
zim22
Дата 14.7.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Vetos @  14.7.2009,  21:22 Найти цитируемый пост)
Да

чтобы было меньше проблем - память выделяйте в конструкторе. удаляйте - в деструкторе.
приведите минимальный неработающий пример вашего кода. посмотрим.
***
ошибок нет.
Код

class gg {
  struct Vertex { 
    float coords[3]; 
  };     
  Vertex * Vertices;

public:
  gg() : Vertices(NULL) { }  
  void New(int count) {
    Vertices = new Vertex[count];
  }
  ~gg() {
    delete[] Vertices;    
    Vertices = NULL;
  }
};


int main()
{
  gg first;
  gg second;

  return 0;
}



Это сообщение отредактировал(а) zim22 - 14.7.2009, 21:27


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.