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);
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);
В это случае вылетов нет.НО через диспетчер задач наблюдается утечка памяти.
Вопрос:как в таком случае надо правильно освобождать память?
Цитата: _nic
Код:
buf+=1024*1024;
Цитата: Kogrom
Можно вариант с new и delete? А то мне что-то не нравится эта строчка:
Я вполне ясно и четко выше писал что с new\delete точно такая же фигня :( Вопрос в том как после операции "+=" освободить тот блок памяти.Ведь таже если подрезать на несколько жалких байт ,то потом освобождающяя ф-ция уже неможет освободить память :(
Код:
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;
}
{
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;
}
Цитата: 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;
}
{
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;
}
Хм а такая операция не приведет к повреждению кучи в том случае если приложение многопоточное?Вдруг на том затертом месте окажутся какие то другие(из другого блока памяти) данные?И как можно определить проводились ли над блоком памяти операции -=\+= ?
Цитата: _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;
char *buf = bufconst;
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
cout << buf << endl;
buf += 1024*1024;
strcpy(buf,"sdjbksadbvkjlbsdkvljbsdkjbvkjsdabvkjasdbkvjbasdkjvbsakjbvkjslb");
cout << buf << endl;
buf -= 1024*1024;
delete [] bufconst;
Код:
buf+=1024*1024;
buf=(char*)HeapAlloc(hh,0,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);
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);
И всё работает