| 區域 | 分配方式 | 管理者 | 生命週期 | 典型用途 |
|---|---|---|---|---|
| 棧 | 編譯器自動 (指令級) | CPU/編譯器 | 作用域結束自動釋放 | 函數參數、局部變量、返回地址 |
| 堆 | new/malloc | 程序員 | 手動 delete/free 或進程結束回收 | 動態對象、大數組、跨作用域數據 |
| 靜態/全局區 | 編譯期靜態分配 | 系統 | 程序全生命週期 | 全局變量、static 變量、常量字符串 |
<cstdlib>。void*,需強制類型轉換。init()/destroy() 模擬構造/析構。MyObject* obj = (MyObject*)malloc(sizeof(MyObject)); obj->initialize(); // 手動初始化 // ... use ... obj->destroy(); // 手動清理 free(obj); // 釋放內存 obj = nullptr;
new 對應 delete,new[] 對應 delete[]。MyObject* obj = new MyObject(); // 自動構造 // ... use ... delete obj; // 自動析構 + 釋放內存 obj = nullptr; // 防野指針
兩種情況產生野指針:
delete/free 後指針值未變,指向已釋放內存。鐵律:定義即初始化 nullptr,釋放後立即置 nullptr。
Cocos2d-x 繼承自 Ref 類,實現手動引用計數:
retain():引用計數 +1。release():引用計數 -1,歸零時自動 delete this。autorelease():放入自動釋放池,當前幀結束時 release()。create() 靜態工廠方法:new -> init() -> autorelease() -> return,調用者無需手動 release。ClassName::create(),返回已 autorelease 的對象。onEnter 中 retain(),onExit 中 release()。addChild() 內部已 retain(),removeChild() / removeFromParent() 內部 release()。Vector<Ref*>, Map<string, Ref*> 會自動管理元素引用計數。C++11 智能指針 (std::shared_ptr, std::unique_ptr) 不能直接管理繼承 Ref 的 Cocos 物件,因雙重釋放會崩潰。但可用於管理純 C++ 對象、第三方庫資源、非 Ref 類成員。建議:
retain/release/autorelease 規範。std::make_unique/shared_ptr。shared_ptr<Ref> 形成循環引用。new/delete。create/retain/release/autorelease 生命週期。