Teacher& Teacher::retT() {
Teacher t1(120);
Teacher& t2 = t1;
return t2; // 返回區域物件引用 → 未定義行為
}
void main() {
Teacher t1(12);
Teacher& t2 = t1.retT(); // 引用接收:看似正常輸出 120
// Teacher t2 = t1.retT(); // 值接收:崩潰或輸出亂碼
}
返回區域物件引用屬於未定義行為 (UB)。函數結束時 t1 生命週期結束,記憶體被回收/覆寫。後續存取皆為「碰運氣」。
Teacher& t2 = ... 直接綁定引用,不產生副本,暫時讀取到尚未被覆寫的棧記憶體(殘留值 120)。Teacher t2 = ... 呼叫複製建構子 Teacher(const Teacher&),此時來源物件已銷毀,讀取到無效記憶體導致崩潰/亂碼。Teacher Teacher::retT() {
return Teacher(120); // 直接返回臨時物件
}
Teacher& Teacher::retT() {
static Teacher t(120); // 靜態區域變數,生命週期至程式結束
return t;
}
// 或
Teacher* Teacher::retT() {
return new Teacher(120); // 呼叫端負責 delete
}
return Teacher(...) 高效且安全。