C++ 編譯器不會自動管理函數參數的生命周期。 這是 C++ 與 Rust、Go 等現代語言的根本區別。
void outer() {
int local = 42; // 棧上分配
inner(&local); // 傳遞地址
// local 在 outer 返回時銷毀
}
void inner(int* ptr) {
// ptr 指向的內存在此處有效
// 但若 inner 返回後 outer 繼續執行並修改 local,
// 或 outer 返回導致棧幀銷毀,ptr 變成懸空指針
}
int* dangerous() {
int x = 10;
return &x; // 錯誤:x 在函數返回時銷毀,返回懸空指針
}
void startAsync() {
int config = 100;
asyncTask([config]() { // 值捕獲安全
use(config);
});
asyncTask([&config]() { // 引用捕獲危險!
use(config); // 若 startAsync 返回,config 已銷毀
});
}
std::vector vec;
vec.push_back(std::string("temp").c_str()); // 臨時對象析構,指針失效
std::shared_ptr 共享所有權,std::unique_ptr 獨占所有權
// 參數傳遞準則
void func(const std::string& s); // 僅讀,大對象用 const 引用
void func(std::string s); // 需要修改副本,傳值利用移動語義
void func(std::string&& s); // 接管所有權(罕用)
void func(std::shared_ptr ptr); // 共享所有權
void func(std::unique_ptr ptr); // 轉移所有權
C++ 將內存管理責任完全交給程序員,「編譯器不管理」既是靈活性的來源,也是坑的根源。理解所有權和生命周期是寫出正確 C++ 代碼的核心技能。