Reg*_*gie 5 c++ memory-leaks visual-c++
Microsoft Visual Studio 2008给出了以下警告:
警告C4150:删除指向不完整类型'GLCM :: Component'的指针; 没有破坏者叫
这可能是因为我已经定义了Handles来在几个地方转发声明的类型,所以现在Handle类声称它不会在给定对象上调用析构函数.
我有VLD运行,我没有看到任何泄漏.这实际上不是为此对象调用析构函数,还是"可能不会调用析构函数对象"警告?
还有另外一个内存泄漏问题,哈哈.
根据C++标准(ISO/IEC 14882:2003 5.3.5/5):
如果被删除的对象在删除时具有不完整的类类型,并且完整的类具有非平凡的析构函数或释放函数,则行为是未定义的.
因此,如果您的类具有非平凡的析构函数,请不要这样做,无论Visual C++如何处理这种情况.
它经常在使用Pimpl时发生,因此我将专注于那里的解决方案:
class FooImpl;
class Foo
{
public:
// stuff
private:
Pimpl<FooImpl> m_impl;
};
Run Code Online (Sandbox Code Playgroud)
这里的问题是,除非你声明一个析构函数,否则它将由编译器自动生成内联.但是,编译器当然不知道FooImpl那里的完整类型.
因此,您必须显式定义析构函数,即使是空的,并将定义放在FooImpl可见的完整类型的位置.
// cpp file
class FooImpl
{
};
Foo::~Foo() {} // Empty, but now correctly generated
// because FooImpl complete at this point.
Run Code Online (Sandbox Code Playgroud)
另外,如果像我一样你定义你的Pimpl类非常聪明(关于构造,复制和赋值),那么那些也需要在.cpp文件中定义.
这真的很麻烦,但是你已经很好地封装了你的实现细节,所以我认为这是值得的.