我遇到了内存泄漏问题,它实际上是从以下结构数组生成的:
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 :(得分:7)
这是一个错误泄漏的例子 - 泄漏检测器发现在检测器运行时没有释放分配的内存。但是检测器在静态对象析构函数之前运行,因此在释放内存之前运行。这就是为什么它从探测器的角度来看是泄漏的,但它实际上不是泄漏。
答案 1 :(得分:1)
这是一种误报,但即使不是,也没有任何意义, 作为一个全局(或静态)变量,该数组的空间在编译时计算并分配,以存储在数据段中,此内存永远不会被释放。 内存在运行时动态分配而不被释放时发生内存泄漏