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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освобождение памяти из-под структуры, Ошибка при попытке освободить память 
V
    Опции темы
Migelь
Дата 25.2.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток, проблема вроде как на ровном месте.
Создается массив структур, работа с ним, далее освобождаем память. Тут самое интересное, начинает ругаться матом "Damage:after normal block(#42) at 0x00490030". Ругается в конце, во время 
Код

free(buffer);



Уже пробовал писать и delete[] buffer, и delete(buffer), словом, я чего-то не замечаю.

Код

struct Time
    {
        unsigned h;
        unsigned m;
        unsigned s;    
    };

void main(void)
{
    cout<<"Privet"<<endl;
    Time*  buffer=new Time[];
    cout<<"Vvedite razmernost massiva"<<endl;
    int count;
    cin>>count;
    VvestiTime(buffer,count);
    Pochistit(buffer);
}

void VvestiTime (Time* buffer, int count)
{
    cout<<"vvedite "<<count<<" elevtntov massiva buffer(chas, minuti sekundi)"<<endl;
    for(int i=0;i<count;i++)
    {
        cin>>(buffer+i)->h>>(buffer+i)->m>>(buffer+i)->s;
        cout<<i<<endl;        
    }

}

void Pochistit(Time* buffer)
{
    free(buffer);
}

PM MAIL   Вверх
Dmi3ev
Дата 25.2.2009, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 13
Всего: 41



Код

#include <iostream.h>

struct myTime
    {
        unsigned h;
        unsigned m;
        unsigned s;
    };

void VvestiTime (myTime* buffer, int count)
{
    cout<<"vvedite "<<count<<" elevtntov massiva buffer(chas, minuti sekundi)"<<endl;
    for(int i=0;i<count;i++)
    {
        cin>>(buffer+i)->h>>(buffer+i)->m>>(buffer+i)->s;
        cout<<i<<endl;
    }
}
void Pochistit(myTime* buffer)
{
    free(buffer);
}

void main(void)
{
    cout<<"Privet"<<endl;
    myTime*  buffer=new myTime;
    cout<<"Vvedite razmernost massiva"<<endl;
    int count;
    cin>>count;
    VvestiTime(buffer,count);
    Pochistit(buffer);
}



лучше так...
Код

int main()
{
    cout<<"Privet"<<endl;
    cout<<"Vvedite razmernost massiva"<<endl;
    int count;
    cin>>count;
    myTime*  buffer=new myTime[count];
    VvestiTime(buffer, count);
    Pochistit(buffer);
    
    cout<<endl;
    system("pause");
    return 0;
}


Это сообщение отредактировал(а) Dmi3ev - 25.2.2009, 02:52


--------------------

PM MAIL   Вверх
Migelь
Дата 25.2.2009, 03:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, понял, я сначало создал неизвестно что с неизвестным размером и вышел за пределы. Пасиба.
PM MAIL   Вверх
Carnivore
Дата 25.2.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.12.2008
Где: St.-Petersburg

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



Код

void Pochistit(myTime* buffer)
{
    delete [] buffer;
}

Используйте malloc/free или new/delete.

Добавлено через 2 минуты и 43 секунды
В первом случае (malloc/free) придется явно вызывать конструктор и деструктор, что не очень хорошо. И вообще намешали вы тут C и C++.
PM MAIL   Вверх
bsa
Дата 25.2.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Согласен с Carnivore. Более того, есть правило хорошего тона, освобождать память в той же функции, что и выделение. Т.е. в твоем случае операция delete []buffer должна быть выполнена в конце функции main().

На будущее: функция main() должна возвращать int, т.е. нужно выбрать один из двух вариантов определения:
Код
int main() {
...
   return 0;
}
//или
int main(int argc, char *argv[])
{
...
   return 0;
}
Если ты будешь продолжать писать void main(), то рано или поздно столкнешься с тем, что программа просто не собирется.


M
bsa
Migelь, если ответ на вопрос получен, то пометь тему решенной

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


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.12.2008
Где: St.-Petersburg

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



Или просто
Код

int main()
{
}

 smile

Добавлено через 4 минуты и 59 секунд
если у тебя современный компилятор
PM MAIL   Вверх
bsa
Дата 25.2.2009, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Carnivore @ 25.2.2009,  20:04)
Или просто
Код

int main()
{
}

 smile

Добавлено @ 20:09
если у тебя современный компилятор

Чем это отличается от моего первого варианта? Отстуствием return?
PM   Вверх
Carnivore
Дата 25.2.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 9.12.2008
Где: St.-Petersburg

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



Цитата(bsa @  25.2.2009,  22:22 Найти цитируемый пост)
Отстуствием return? 

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


Опытный
**


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

Репутация: 2
Всего: 10



Цитата(Carnivore @  25.2.2009,  22:41 Найти цитируемый пост)
угу 


return 0 будет подставлен неявно. и никакой разницы.


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

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

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

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

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


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

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


 




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


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

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