<分区>
我们管理一些多平台代码,我遇到了这种只在 Linux 上发生的最奇怪的内存泄漏。
我有一个既不继承也不被继承的类。因为它没有任何需要释放的动态分配,所以我没有为它定义析构函数(它确实有一些自毁成员——没有一个是指针)。
我们注意到这个类的生成(新建)和销毁(删除)导致了内存泄漏。 在头文件上定义和实现一个空的析构函数并没有解决泄漏问题。将实现移动到源文件 - 确实解决了它。这(泄漏)不会发生在 Windows 上,但会发生在 Linux 上。
我想这与编译器优化有关 - 但如果是这样,我真的很想知道这种现象的基础,这样我就会知道如何再次避免这种泄漏。
有人知道为什么会这样吗?
这是代码的草图(当然不是真正的...)
//file config.h
class Config
{
public:
Config(std::shared_ptr<PR_Config> prConfig)
{mPRConfig = engineConfig; mConfigOccurences++;};
~Config(){}
shared_ptr<PR_Config>...
...
...
...
//some public functions
private:
shared_ptr<PR_Config>...
...
...
...
//some private members of shared_ptr type
};
//file: ConfigChecker.cpp
bool ConfigChecker::CheckConfig()
{
shared_ptr<Config> localConfig;
localConfig = GenerateConfig();
//Do some stuff with local config. did not change the reference count...
if (locakConfig)
return true;
return false;
}
//file: Utils.cpp
shared_ptr<Config> GenerateConfig()
{
shared_ptr<Config> pConfig = new Config(/*som parameters here...*/)
return pConfig;
}
重要提示:
- 将 ~Config 的实现移动到 config.cpp 文件时,泄漏停止。
- 我们实际上并没有使用 shared_ptr,而是使用了其他一些具有引用计数和自毁功能的智能指针。但我不相信它正在做...