初學 C++ 時,常見一個困惑:為何資深開發者傾向使用 Object* myObject = new Object; 而非 Object myObject;?呼叫成員函數時也偏好 myObject->testFunc(); 而非 myObject.testFunc();。直覺認為直接存取記憶體位址能提升效率,這理解正確嗎?
這其實包含兩個獨立議題:何時使用動態分配(new) 與 何時使用指標。盲目使用原始指標與 new/delete 是典型新手錯誤,現代 C++ 強調「使用正確工具」,優先採用更安全、更適切的機制。
Object myObject; 建立的是自動變數,生命週期綁定作用域,離開作用域自動銷毀。new Object() 則在堆疊動態分配記憶體,物件存活直到呼叫 delete。僅在以下情況才需動態分配:
現代最佳實踐:若確需動態分配,務必封裝於智慧指標(std::unique_ptr、std::shared_ptr)或具 RAII 特性的容器中。智慧指標提供所有權語意,遵循 Rule of Zero,幾乎免除手動記憶體管理。
指標有多重用途,但多數情況有更優替代方案:
nullptr 表示物件可省略。優先用預設參數、函數多載或 std::optional。結論:除非有明確理由(多型、C API 介接、編譯防火牆等),否則優先使用值語意、參考、智慧指標。原始指標與手動 new/delete 是底層工具,非日常首選。