奇怪的内存泄漏

时间:2009-11-10 08:37:55

标签: c++ visual-studio-2008 memory-leaks

我遇到了内存泄漏问题,它实际上是从以下结构数组生成的:

TagStruct TagData [] =
{

    { Tag_SecurityToken, string("x-abc-security-token"), string("ab-security-token") } ,
    { Tag_XYZ, string("x-abc-xyz"), string("ab-xyz") },
    { Tag_ChunkCount, string("x-abc-meta-chunk"), string("ab-meta-chunk") },
    { Tag_OriginalFileSize, string("x-abc-meta-totalsize"), string("ab-meta-totalsize")}

};

奇怪的是当然是内存泄漏问题和最奇怪的问题是当我关闭客户端时 VS转储第一,第三和第四个元素而不是第二个元素(Tag_XYZ)。 在我调用数组之前,第一次运行时似乎会产生内存泄漏,并且请记住我只使用该数组进行检查:

string Get_Tag (Tags tag)
{
    return  m_ClientType == CType_ABC ? TagData[tag].strABC : TagData[tag].strAB;
}
实际上这就是它的全部原因。因此,没有任何类型的内联堆/内存分配。

标签结构看起来像这样:

struct TagStruct
    {
        Tags tag;
        std::string strABC;
        std::string strAB;
    };

我还想告诉你,这是一个全局数组,我也试图让它静态但不断发生内存泄漏,我也尝试将数组中的字符串声明为"str"而不是比string("str")但不断发生内存泄漏。是的,内存泄漏是静态的,这意味着它不会随着时间的推移而构建,但仍然可以更好地保持干净的代码。有什么建议??

2 个答案:

答案 0 :(得分:7)

这是一个错误泄漏的例子 - 泄漏检测器发现在检测器运行时没有释放分配的内存。但是检测器在静态对象析构函数之前运行,因此在释放内存之前运行。这就是为什么它从探测器的角度来看是泄漏的,但它实际上不是泄漏。

答案 1 :(得分:1)

这是一种误报,但即使不是,也没有任何意义, 作为一个全局(或静态)变量,该数组的空间在编译时计算并分配,以存储在数据段中,此内存永远不会被释放。 内存在运行时动态分配而不被释放时发生内存泄漏