2009-11-10 100 views
2

我有一个内存泄漏问题,它实际上是从以下结构排列形成:奇怪的内存泄漏

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"),但不断收到内存泄漏。是的,内存泄漏是静态的,这意味着它不会随着时间的推移而建立,但仍然更好地保持干净的代码。有什么建议么??

+0

错误..我没有看到泄漏..你确定吗? – 2009-11-10 08:41:28

+0

好吧,这就是VS说的,坦率地说,我也没有真正看到泄漏,这就是为什么我用“怪异”这个词 – 2009-11-10 08:43:23

回答

7

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

+0

认为我的自我,但我想检查... – 2009-11-10 08:45:50

+0

我也想知道为什么VS只转储数组的第一,第三和第四个元素而不是第二个? – 2009-11-10 08:47:22

+0

@红蛇所以作为一种解决方法,您可以通过将结构放入Get_Tag函数来使结构非静态。我不知道编译器可以做什么来优化,但我的猜测是,没有巨大的性能影响。 – foraidt 2009-11-10 08:58:38

1

这是一个虚惊,但即使它不是,它不会有任何意义, 是一个全局(或静态)变量,这个数组的空间在编译时计算和分配,存储在数据段,这个内存永远不会被释放。 当内存在运行时动态分配而未被释放时发生内存泄漏