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

Ваш аккаунт

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

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

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

Как правильно освободить память

841
10 апреля 2009 года
_nic
199 / / 29.07.2006
Вот такой код
 
Код:
hh=HeapCreate(0,0x01000,0);
char *buf=(char*)HeapAlloc(hh,0,1024*1024);
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
buf+=1024*1024;
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
MessageBox(0,buf,"!",MB_OK);
HeapFree(hh,0,buf);

Тут конечно же на последней строке идет вылет в отладчик с матюком что в rtlfreeheap был передан кривой указатель на блок памяти.При испоьзование new\delete,malloc\free то же самое.
А теперь такой вот код
 
Код:
hh=HeapCreate(0,0x01000,0);
char *buf=(char*)HeapAlloc(hh,0,1024*1024);
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
buf+=1024*1024;
buf=(char*)HeapAlloc(hh,0,1024*1024);
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
MessageBox(0,buf,"!",MB_OK);
HeapFree(hh,0,buf);

В это случае вылетов нет.НО через диспетчер задач наблюдается утечка памяти.
Вопрос:как в таком случае надо правильно освобождать память?
87
10 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Можно вариант с new и delete? А то мне что-то не нравится эта строчка:
Цитата: _nic

 
Код:
buf+=1024*1024;

841
10 апреля 2009 года
_nic
199 / / 29.07.2006
Цитата: Kogrom
Можно вариант с new и delete? А то мне что-то не нравится эта строчка:



Я вполне ясно и четко выше писал что с new\delete точно такая же фигня :( Вопрос в том как после операции "+=" освободить тот блок памяти.Ведь таже если подрезать на несколько жалких байт ,то потом освобождающяя ф-ция уже неможет освободить память :(

87
10 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Работает же :)
Код:
int main()
{
    char *buf =new char[2 * 1024*1024];
    strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
    cout << buf << endl;
    buf += 1024*1024;
    strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
    buf -= 1024*1024;
    cout << buf << endl;
    delete [] buf;
    return 0;
}
841
10 апреля 2009 года
_nic
199 / / 29.07.2006
Цитата: Kogrom
Работает же :)
Код:
int main()
{
    char *buf =new char[2 * 1024*1024];
    strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
    cout << buf << endl;
    buf += 1024*1024;
    strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
    buf -= 1024*1024;
    cout << buf << endl;
    delete [] buf;
    return 0;
}



Хм а такая операция не приведет к повреждению кучи в том случае если приложение многопоточное?Вдруг на том затертом месте окажутся какие то другие(из другого блока памяти) данные?И как можно определить проводились ли над блоком памяти операции -=\+= ?

87
10 апреля 2009 года
Kogrom
2.7K / / 02.02.2008
Цитата: _nic
И как можно определить проводились ли над блоком памяти операции -=\+= ?


Не проводите их. Вообще. Зачем вы их делаете?
Если уж так надо, то запомните указатель, который использовали для выделения памяти:

 
Код:
char *const bufconst = new char[2 * 1024*1024];
    char *buf = bufconst;
    strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
    cout << buf << endl;
    buf += 1024*1024;
    strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
    cout << buf << endl;
    buf -= 1024*1024;
    delete [] bufconst;
350
19 апреля 2009 года
cheburator
589 / / 01.06.2006
 
Код:
buf+=1024*1024;
buf=(char*)HeapAlloc(hh,0,1024*1024)

Вот в этих двух строчках и кроется проблема, вы сначала присваиваете buf одно значение, потом другое, а первое теряется. Тут и утечка. Скажем так, выделено 2 куска памяти, а освобожден только один.
Перепишем код как-то так
 
Код:
hh=HeapCreate(0,0x01000,0);
char *buf=(char*)HeapAlloc(hh,0,1024*1024);
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
char *buf2=(char*)HeapAlloc(hh,0,1024*1024);
strcpy(buf2,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
MessageBox(0,buf2,"!",MB_OK);
HeapFree(hh,0,buf);
HeapFree(hh,0,buf2);

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