הקצאה דינמית היא מתן זיכרון לתוכנית בזמן הריצה, ולא מראש.
זיכרון שהוקצה כך נשאר בשליטה עד שמשתחרר במפורש על ידי המתכנת, או על ידי מנגנון אוטומטי כמו אספן זבל (garbage collector), שמחזיר זיכרון שלא בשימוש.
שיטה זו מאפשרת לתוכנה להשתמש בזיכרון רק כשצריך. זה טוב כי חוסך מקום ומגמיש את התכנון. מצד שני, יש בעיות מעשיות: פרגמנטציה פנימית וחיצונית, פירושן חלקי זיכרון מפוזרים שקשה להשתמש בהם, וקושי לנהל המון הקצאות קטנות בלי לבזבז משאבים.
בדרך כלל מבקשים זיכרון מהמערכת ההפעלה. בקשה כזו עלולה להיכשל אם אין מקום פנוי בגודל הנדרש. לכן אפליקציות קריטיות, כמו מערכות למטוסים, נוטות להימנע מהקצאה דינמית. זה מקשה על הפיתוח, אבל מעלה את היציבות, כי ברור אילו משאבים זמינים מראש.
[20]int* a = new int;
(int* a = malloc(sizeof(int)*20;
הקצאה דינמית היא לתת לתוכנית מקום בזיכרון בזמן שהיא רצה.
זיכרון זה נשמר עד שמחזירים אותו. אספן זבל (garbage collector) יכול להשיב זיכרון שלא משתמשים בו.
השיטה טובה כי נותנת מקום רק כשצריך. לפעמים נוצרים חלקים קטנים של זיכרון שלא ניתן להשתמש בהם. זה נקרא פרגמנטציה.
לעתים המערכת לא יכולה לתת עוד זיכרון. בגלל זה תוכניות מאוד חשובות, כמו תוכנות למטוסים, לא משתמשות בהקצאה דינמית.
[20]int* a = new int;
(int* a = malloc(sizeof(int)*20;