#include <stdio.h> #include <stdlib.h> class apple { private: char* pName; //類裏面含有指針 public: apple() { printf("helloworld!\n"); pName = NULL; pName = (char* )malloc(100*sizeof(char)); } ~apple() { if(NULL != pName) { printf("helloworld!2\n"); free(pName); pName = NULL;//即使賦值爲NULL,也不能阻止出現被釋放兩次 } } }; void process(apple* b) { apple* a; a = b; printf("abOK!\n"); apple *c,d;//只有一個實例,且申明一個對象指針,指針沒有調用構造函數和析構函數,而實例類變變量則會調用析構函數 *c = d; printf("cdOK!\n"); apple *e,*f; e = f; //將e的地址覆蓋爲f的地址,不是實體變量,沒事 printf("efOK!\n"); //apple *g, *h; //*g = *h;//意圖引用空指針,段錯誤 //printf("i,k Now!\n"); //apple i, j; //i = j; //用實體j初始化i, 使用了淺複製,導致 i分配給pName地址丟失了,無法重新釋放回收 apple k; k = *b; //用valrind檢測存在內存泄露!!! printf("kOK!\n"); } int main() { apple b; process(&b); return 0; }