c++ - 当在头文件而不是 CPP 文件上实现时,析构函数会导致内存泄漏 - 仅在 linux 上

标签 c++ linux memory-leaks

<分区>

我们管理一些多平台代码,我遇到了这种只在 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,而是使用了其他一些具有引用计数和自毁功能的智能指针。但我不相信它正在做...

最佳答案

我已经看到这种由前向声明和 std::auto_ptr 创建的不完整类型的确切行为。

我相信 shared_ptrunique_ptr 的当前版本已经通过使用显式析构函数解决了这个问题,如果定义不可见,它们将无法编译。

我怀疑您的“其他一些智能指针”没有这样做,或者没有正确地这样做。做对是很棘手的。 C++ 标准人员发明了 auto_ptr 并在解决此问题之前使用了多年。

关于c++ - 当在头文件而不是 CPP 文件上实现时,析构函数会导致内存泄漏 - 仅在 linux 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830442/

相关文章:

c++ - 为什么 setspacing 属性不起作用?

c++ - 在 Linux for Windows 上交叉编译 Qt5

java - JFrame 泄漏内存?

Android如何分析内存

linux - 是否有一个 linux 命令可以在特定点将一个文件复制到另一个文件中?

C# OpenXML 内存泄漏

c++ - 您如何理解错误 : cannot convert from 'int []' to 'int []'

C++: list 和从不同目录动态加载 DLL

c++ - 如果 constexpr 分支的 MSVC 和 clang 的不同行为

c++ - FFTW 的功率谱不起作用,但在 MATLAB 中它可以