我想在全局範圍內定義一個包含一些動態分配數組的類。當調用類的構造函數時,程序無法訪問通過參數文件讀取的用戶定義參數(即模擬中的年數),因此無法將內存分配到適當的大小。我的想法是在類中的私有函數內分配內存,然後使用析構函數釋放它。一些示例代碼:如果一個析構函數使用C++中的私有函數分配內存,它可以釋放內存嗎?
class Simulation{
private:
int initial_call; //a flag used to initialize memory
double *TransferTracker;
public:
Simulation();
~Simulation();
void calc();
};
Simulation simulator; //global instance of Simulation
Simulation::Simulation()
{
initial_call = 1;
}
Simulation::~Simulation()
{
//when calling the destructor, though, the address is
//0xcccccccc and the following attempt to delete produces
//the compiler error.
delete [] TransferTracker; //see error
}
void Simulation::calc()
{
for (int i = 0; i < num_its; i++)
{
if (initial_call)
{
TransferTracker = new double [5];
//The address assigned is, for example, 0x004ce3e0
initial_call = 0;
}
}
//even if this calc function is called multiple times, I see
//that the address is still 0x004ce3e0.
}
我從上面的代碼片段收到的錯誤是:
Unhandled exception at 0x5d4e57aa (msvcr100d.dll) in LRGV_SAMPLER.exe: 0xC0000005: Access
violation reading location 0xccccccc0.
該錯誤是有道理的,因爲我進入析構函數時檢查TransferTracker的存儲器地址。我的問題是,爲什麼我們在進入析構函數時失去了地址?這可能與模擬器是全球性的事實有關;如果這個類不是全球性的,這個範例似乎工作得很好。我是新來的面向對象編程,所以任何幫助表示讚賞!
編輯:這基本上是我的錯誤,並得到了答案的幫助。出現了兩個問題:(1)指針從未設置爲NULL,因此在嘗試刪除未分配的指針時產生混淆。 (2)在我的範圍內,實際上有兩個班的實例,這是我的錯誤。在最終的代碼中,將只有一個實例。感謝大家!
你的析構函數如何被調用?它是全球性的,所以它只會被稱爲obn程序退出權限? –
是的,這是正確的;它在程序出口處。 – Joe