C++記憶體管理之結構體記憶體釋放
阿新 • • 發佈:2019-01-10
C++中使用new和delete申請和釋放記憶體空間,二者是成對出現的,缺一不可。使用new開闢的記憶體空間位於堆中,只能通過delete釋放,這與區域性變數不同,區域性變數儲存在棧中,變數生存週期結束後其記憶體也隨之釋放。
結構體中成員變數中存在指標的,其記憶體釋放遵循從裡向外的原則,即先釋放成員變數的記憶體,然後在釋放結構體指標。由於C++中允許結構體中使用建構函式和解構函式,建構函式對成員資料進行初始化,解構函式對記憶體進行清理。解構函式在對結構體進行釋放時呼叫,首先釋放解構函式中的成員變數記憶體,然後釋放結構體指標記憶體。
由於lpExtInfo為LPVOID型別,僅代表一個地址值,是一個不確定的型別,在使用過程中需要經過型別轉換,因此在結構體的解構函式中,不能對其進行釋放,必須在程式中根據使用的型別進行顯示的釋放。struct _STU_FamilyInfo { int nAge; }; struct _STU_StudentINFO { char* pstrName; int nAge; int nFamilyMember; _STU_FamilyINFO* pstuInfo; LPVOID lpExtInfo; _STU_StudentINFO() { pstrName = NULL; nAge = 0; nFamilyMember = 0; lpExtInfo = NULL; pstuInfo = NULL; }; ~_STU_StudentINFO() { if(pstrName) { delete []pstrName; pstrName = NULL; } if(pstuInfo) { delete []pstuInfo; pstuInfo = NULL; } }; }; _STU_StudentINFO* pstuStudent = new _STU_StudentINFO; pstuStudent->pstrName = "Sunny"; pstuStudent->nAge = 27; pstuStudent->nFamilyMember = 2; _STU_FamilyInfo* pstuFamilyMember = new _STU_FamilyInfo[2]; //...... 成員變數賦值 pstuStudent->lpExtInfo = new char[256]; memccpy(pstuStudent->lpExtInfo,"無其他說明",256) // 記憶體釋放 if( pstuStudent->lpExtInfo ) { delete []pstuStuden->lpExtInfo; pstuStudent->lpExtInfo = NULL; } if(pstuStudent) { delete pstuStudent; pstuStudent = NULL; }
成員函式的其他記憶體在呼叫結構體指標的釋放函式時,自動呼叫解構函式進行記憶體釋放,也就是其生命週期結束。