【发布时间】:2015-06-04 15:48:45
【问题描述】:
简短:删除模板化指针不会调用析构函数。
include 解决了这个问题。为什么?
我刚刚遇到了一个我无法解释的情况。我试图在这里打破更复杂的情况。
文件 R.cpp
class R {
Owner<Problem> m_o;
void cleanUp() { m_o.clear(); }
}
文件所有者.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 中包含问题标头可以解决问题。编译器没有抱怨。这是编译器的错误吗?
系统: g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
【问题讨论】:
-
为什么不
std::vector<std::unique_ptr<T>>? -
在这种情况下,T 可能是什么?
-
添加或删除这样的代码行,然后看到不同的行为表明您有内存损坏错误。您真正要做的只是更改可执行映像,将错误移动到程序的不同部分。所以你真的没有解决问题。
-
你在
R::cleanUp()而不是R::~R()中调用m_o.clear()
标签: c++ templates destructor