Microsoft Visual Studio 2008给我以下警告:
警告C4150:删除了指向不完整类型'GLCM::Component'的指针;没有析构函数被调用
这可能是因为我已经定义了Handles在多个地方转发声明的类型,所以现在Handle类声称它不会在给定对象上调用析构函数。
我正在运行VLD,但没有发现任何泄漏。这是不是字面上没有调用此对象的析构函数,还是“可能无法调用对象的析构函数”警告?
我还有另一个内存泄漏问题,哈哈。
最佳答案
使用Pimpl时通常会发生这种情况,因此我将重点关注那里的解决方案:
class FooImpl;
class Foo
{
public:
// stuff
private:
Pimpl<FooImpl> m_impl;
};
这里的问题是,除非您声明析构函数,否则它将由编译器自动内联生成。但是,当然,编译器在那里不知道
FooImpl
的完整类型。因此,即使是空的,也必须显式定义析构函数,并将定义放在整个
FooImpl
类型可见的位置。// cpp file
class FooImpl
{
};
Foo::~Foo() {} // Empty, but now correctly generated
// because FooImpl complete at this point.
另外,如果像我一样将
Pimpl
类定义为非常聪明(关于构造,复制和分配),则也需要在.cpp文件中进行定义。这确实很麻烦,但是您已经很好地封装了实现细节,所以我认为这是值得的。