samin_panahi
دوشنبه 13 دی 1395, 11:43 صبح
سلام
چطور می شه یک بافر رو چک کرد که اگر free شده دیگه مجدد free روش صورت نگیره
این برنامه رو ببینید:
#define LEN1 100000
#define LEN2 200000
Buffer = (CHAR*) HeapAlloc(GetProcessHeap(), 0, LEN1);
if (Buffer) // 1
{
// ...
if (something) // 2
{
// do something with Buffer and use it
// ...
HeapFree(GetProcessHeap(), 0, Buffer);
Buffer = (CHAR*) HeapAlloc(GetProcessHeap(), 0, LEN2);
if (Buffer) // 3
{
// do something with Buffer and use it
// ...
HeapFree(GetProcessHeap(), 0, Buffer);
}
}
HeapFree(GetProcessHeap(), 0, Buffer);
}
اگر برنامه وارد حلقه ی 3 بشه در انتهای حلقه بافر آزاد می شه و دیگه تیاز نیست در انتهای حلقه ی 1 اون رو آزاد کرد
اما اگر وارد حلقه ی 2 یا 3 نشه باید در انتهای حلقه ی 1 آزاد بشه
در صورتی که وارد حلقه ی 3 بشه و در انتهای حلقه ی 1 هم HeapFree فراخوانی بشه برنامه کرش می کنه
چطور باید چک کنم که اگر free نشده free کن و اگر شده HeapFree فراخوانی نشه؟
چطور می شه یک بافر رو چک کرد که اگر free شده دیگه مجدد free روش صورت نگیره
این برنامه رو ببینید:
#define LEN1 100000
#define LEN2 200000
Buffer = (CHAR*) HeapAlloc(GetProcessHeap(), 0, LEN1);
if (Buffer) // 1
{
// ...
if (something) // 2
{
// do something with Buffer and use it
// ...
HeapFree(GetProcessHeap(), 0, Buffer);
Buffer = (CHAR*) HeapAlloc(GetProcessHeap(), 0, LEN2);
if (Buffer) // 3
{
// do something with Buffer and use it
// ...
HeapFree(GetProcessHeap(), 0, Buffer);
}
}
HeapFree(GetProcessHeap(), 0, Buffer);
}
اگر برنامه وارد حلقه ی 3 بشه در انتهای حلقه بافر آزاد می شه و دیگه تیاز نیست در انتهای حلقه ی 1 اون رو آزاد کرد
اما اگر وارد حلقه ی 2 یا 3 نشه باید در انتهای حلقه ی 1 آزاد بشه
در صورتی که وارد حلقه ی 3 بشه و در انتهای حلقه ی 1 هم HeapFree فراخوانی بشه برنامه کرش می کنه
چطور باید چک کنم که اگر free نشده free کن و اگر شده HeapFree فراخوانی نشه؟