簡而言之:刪除模板化指針不會調用析構函數。C++:不使用嵌入模板調用的析構函數
包括解決問題。爲什麼?
我剛碰到一個我無法解釋的情況。我試圖在這裏打破更復雜的情況。
文件R.cpp
class R {
Owner<Problem> m_o;
void cleanUp() { m_o.clear(); }
}
文件Owner.cpp
struct DeleteFunctor {
template< class TPtr > void operator()(TPtr* ptr) { delete ptr; }
};
template< class T >
class Owner {
std::vector<T*> m_objects;
// here add and other stuff
void clear() {
std::for_each(m_objects.begin(), m_objects.end(), DeleteFunctor());
m_objects.clear();
}
我現在有堆上創建新問題的對象,並將它們直接插入到m_o一個實用程序類。我知道將引用導出到內部類型是不好的方式,但這不是重點。
如果我打電話給cleanUp(),我可以追蹤到Functor的調用delete ptr,ptr的問題類型正確。但問題 - 析構函數不叫!
但是,包括文件R.cpp中的問題標題可以修復問題。該comiler不抱怨。這是一個編譯器錯誤?
系統: 克++(Ubuntu的4.8.2-19ubuntu1)4.8.2
爲什麼不'std :: vector>'? –
2015-03-31 10:27:29
在這種情況下可能會發生什麼? – Robinson 2015-03-31 10:27:38
添加或刪除這樣的代碼行然後看到不同的行爲表明您有內存損壞錯誤。你真正要做的就是改變可執行映像,將錯誤轉移到程序的不同部分。所以你真的沒有解決這個問題。 – PaulMcKenzie 2015-03-31 10:31:02