類中定義 vector<Single*> ans 作為 public 成員。在某函數中 push_back 後 size 正常,ListBox 顯示無誤。但在另一按鈕響應函數 OnLbnDblclkList1 中訪問 ans[m_list.GetCurSel()] 時,ans.size() 突然變為極大值,元素值亂碼,導致「不適當的參數」錯誤。
ans 存儲的是指針 Single*。若指針指向的對象在 push_back 後被銷毀(如棧上臨時對象、局部 new 後未保存所有權),隨後訪問即成懸空指針。_Myfirst/_Mylast/_Myend 三指針。#include
#include
using namespace std;
class MyClass {
public:
vector> ans; // 或 unique_ptr 若所有權唯一
void AddSingle(Single* p) { ans.emplace_back(p); }
};
class MyClass {
public:
vector ans;
MyClass() = default;
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
MyClass(MyClass&&) = default;
MyClass& operator=(MyClass&&) = default;
~MyClass() { for (auto p : ans) delete p; } // 手動釋放
};
若 Single 體積不大且無多態需求,直接存 vector<Single>,避免指針管理麻煩。
ans.data()、ans.size()、ans.capacity() 及首尾元素地址。Application Verifier 或 AddressSanitizer 定位堆損壞來源。vector size 突變極大值幾乎總是堆損壞或懸空指針導致的內部元數據被破壞。核心對策是明確所有權語義(智能指針/值存儲)、避免淺拷貝、嚴格檢查指針生命週期。