TL; DR刪除自定義陣列導致堆錯誤
升壓試驗框架崩潰,並沒有同時通過所有測試和泄漏的所有內存給定的錯誤。
測試失敗多次提到的析構函數實現。清除函數也會拋出堆錯誤。
我們在做什麼錯誤的dtor?
TL; DR
這是關於大學家庭作業,和我的朋友的解決方案,說問題。爲了獲得更多的C風格指針和更低級的編程風格,我們需要實現我們自己的動態數組。
根據我們老師的900-LOC Boost-Test Framework,他的任務是完整的並且功能完整。唯一的問題是當測試退出或調用實現的dtor時崩潰(或堆錯誤,因爲沒有真正的錯誤消息彈出)。
他的動態數組使用三個指針:pFirst, pLast and pEnd
,指向數組的第一個元素,指向數組中最後一個元素的指針,分別指向數組中最後一個尚未分配的元素。
只要他不試圖刪除任何指針,他的程序就會通過。這是一個壞主意,但嘿,它讓他通過任務。目前。
我的朋友已經嘗試了幾次實現析構函數,但它們都會導致堆錯誤並導致測試框架失敗。
// Teacher's recommended dtor.
Field::~Field()
{
for(int i(0); i != this->size(); ++i)
(pFirst+i)->~T();
delete pFirst;
pFirst = pLast = pEnd = NULL;
}
和
// My recommendation to friend.
Field::~Field()
{
delete[] pFirst;
pFirst = pLast = pEnd = NULL;
}
崩潰都與同一個堆錯誤。
Assertion failed: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
測試一個典型的鏈是這樣的:
BOOST_AUTO_TEST_CASE(TEST_clear)
{
Field f(3, 4.0f);
f.clear(); // Error here IF we use delete in the clear method.
BOOST_CHECK(f.size()==0);
BOOST_CHECK(f.capacity()==4);
} // Error here; during destruction IF we have implemented the dtor.
當我們嘗試更換陣列Clear方法發出了同樣的錯誤,所以我們只是有:
void Field::clear()
{
size_t capa = capacity();
T *temp =pFirst;
pFirst = new T[capa];
pLast = pFirst;
pEnd = pFirst+capa;
}
什麼我們是否對dtor做了錯誤,清楚並且一般在處理刪除指針時?
@Pointy:他現在修正了一個錯誤:P – IAE 2010-10-31 15:53:39