حافظهٔ Dynamic در سی و سی++

در زبان سی برای اختصاص حافظهٔ Dynamic باید از چهار تابع malloc, calloc, realloc, free که در کتابخانه string.h قرار دارند، استفاده کرد. سه تابع malloc, calloc, realloc برای اختصاص دادن حافظه استفاده می‌شود و تابع free برای آزاد کردن حافظه‌ای که قبلا اختصاص داده شده بود، استفاده می‌شود.

سه تابع malloc, calloc, realloc دارای مقدار خروجی * void هستند. بنابراین با Typecasting باید خروجی آن را به پوینتر هدف تغییر دهیم. تفاوت calloc با malloc در این است که تابع calloc علاوه‌بر اختصاص حافظه، تمام بیت‌های اختصاص داده شده را برابر صفر (0) قرار می‌دهد؛ بنابراین اگر لازم است که مقدار اولیهٔ متغیرها برابر صفر باشد، می‌توان از این تابع استفاده کرد. البته بعد از اختصاص حافظه با تابع malloc نیز می‌توان مقدار بیت‌ها را با تابع memset برابر صفر (0) قرار داد.

// example 1:
int array[10] = {0};
// example 2:
int *array = (int *)calloc(10, sizeof(int));
// example 3:
int *array = (int *)malloc(sizeof(int) * 10);
memset(array, 0, sizeof(int) * 10);

در مثال شمارهٔ ۱، در حافظهٔ Static آرایه‌ای بنام array و از نوع int با ۱۰ عنصر تعریف شده که مقدار اولیه آن‌ها برای صفر قرار داده شده است. در مثال‌های شمارهٔ ۲ و ۳ به دو روش مختلف در حافظهٔ Dynamic این آرایه به‌وجود آمده و مقدار اولیه آن هم برابر صفر قرار داده شده است. البته فراموش نکنید که بعد از اختصاص حافظه Dynamic، با تابع free آن حافظه را آزاد کنید.

بدلیل اینکه ممکن است سه تابع malloc, calloc, realloc به هر دلیلی نتوانند درخواست ما را عملی کنند، مقدار بازگشتی در این حالت Null Pointer است؛ که خوب است برنامه‌نویس حتما این موضوع را چک کند.

// example 4:
int *array = (int *)malloc(sizeof(int) * 10);
if(array == NULL)
{
    printf("Error: Dynamic memory allocation failed.\n");
    return -1;
}

در زبان سی++ علاوه‌بر روش‌های بالا، با اپراتورهای new, delete هم می‌توان حافظه Dynamic اختصاص داد و آن حافظه را آزاد کرد. توجه داشته باشید که درصورتی که آرایه‌ای با اپراتور new به‌وجود آوردید، باید با []delete آن را آزاد کنید نه delete.

همچنین در زبان سی++ می‌توان از کلاس vector برای تعریف آرایه با سایز متغیر استفاده نمود.

فایل‌های زیر مثال‌های مناسبی هستند که به درک این مطالب کمک می‌کنند.

MD5 checksums:
88dd1a04b9f2e7273b228027538b3b20 *dynamic_memory_c.zip
853e0a203aea4a74b88e5a4ffddbea44 *new_keyword_cpp.zip