高考申論題
105年
[資訊處理] 程式語言
第 三 題
📖 題組:
二、請觀察以下程式碼: class Smart{ public: explicit Smart(int *p = NULL) { sp = p; } ~Smart() { delete(sp); } int& operator*() { return *sp; } private: int *sp; }; int main(void){ Smart p(new int()); *p = 2016; cout << *p << endl; return 0; }
二、請觀察以下程式碼: class Smart{ public: explicit Smart(int *p = NULL) { sp = p; } ~Smart() { delete(sp); } int& operator*() { return *sp; } private: int *sp; }; int main(void){ Smart p(new int()); *p = 2016; cout << *p << endl; return 0; }
📝 此題為申論題,共 3 小題
小題 (三)
請說明此方法為解決何種問題?且程式概念為何?(10 分)
思路引導 VIP
看到自訂類別內部封裝指標,並在建構子賦值、解構子 delete,應立刻聯想到「智慧型指標 (Smart Pointer)」與「RAII」機制。答題時需切分兩部分:一是解決 C++ 手動管理記憶體易導致的 Memory Leak 問題;二是說明 RAII 與運算子多載的概念。
小題 (一)
請問以下 C++程式碼輸出答案為何?(5 分)
思路引導 VIP
看到此題應立刻辨識出這是 C++ 中「智慧指標(Smart Pointer)」的簡易實作。解題關鍵在於追蹤動態記憶體的配置與生命週期,並理解多載解參考運算子 operator* 回傳參考(reference)的特性,使其能作為左值(L-value)被賦值與讀取。
小題 (二)
請問執行至 return 0 時,是否回收原分配給物件 p 之動態記憶體?(5 分)
思路引導 VIP
看到此題,應先辨識物件 p 是一個配置在堆疊(Stack)上的區域變數,而傳入的 new int() 則是配置在堆積(Heap)上的動態記憶體。接著聯想 C++ 的生命週期與 RAII 機制:當區域變數離開作用域時會發生什麼事(自動呼叫解構子),藉此推導出記憶體是否被釋放。