首页 文章

Visual C内存调试器中vector._Reallocate()上的内存泄漏

提问于
浏览
-1

我有两个指针向量:

  • 包含指向所有对象的指针的向量

  • 包含指向上述向量中某些对象的指针的临时向量 . 每个帧,该矢量被清除,然后再次添加指针 .

在这些帧期间不会创建或删除任何对象 .

根据Visual Studio的内存分析器,我每次向这个向量添加指针时都会在vector._Reallocate()中出现内存泄漏 .

图片:http://i.stack.imgur.com/f4Ky3.png

我的问题是:vector.push_back()是否会分配以后未解除分配的内容,或者Visual Studio的内存分析器只是混淆了因为我在不破坏元素的情况下清除了一个向量?这只发生在调试模式下 - 而不是发布模式 .

我知道_Reallocate(..) - 方法在堆上分配空间,但是因为我清除了向量,所以这不应该导致泄漏,我想?

更新:使用std :: list而不是std:.vector解决了"problem" - 虽然我不知道它是不是真的有问题

Update2: It DOES happen in Release mode as well. I was a little bit confused by the output, but I get the same problem there

** Update3:我附上了一些可以重现问题的代码 . 如果我将向量存储在多维数组中,我只能重现问题,就像在原始问题中一样 .

class MyClassContainer
{
public:
    std::vector<MyClass*> vec;
};

int main(int args, char **argv)
{
    std::vector<MyClass*> orig;
    MyClassContainer copy[101][101];
    for(int i = 0; i < 101; i++)
        orig.push_back(new MyClass());
    while (true)
    {
        int rnd = std::rand() * 100 / RAND_MAX; int rnd2 = std::rand() * 100 / RAND_MAX;
        for (int i = 0; i < 101; i++)
            for (int j = 0; j < 101; j++)
                copy[i][j].vec.clear(); // this should clear all??
        copy[rnd2][rnd].vec.push_back(orig[rnd]);
    }

    return 0;
}

Update 4: 随着时间的推移,内存调试器显示越来越多的堆分配 . 但是,我现在注意到,如果我等待很长时间,每秒新堆分配的数量会减少到0 . 所以显然它虽然理解了原因 .

1 回答

  • 0

    不要指出明显的......但是你没有释放在这里创建的MyClass对象 . 由于你有一个原始指针向量,它们必须被释放(并且只释放一次) .

    orig.push_back(new MyClass());
    

    把它放在主要的末端,你的泄漏应该消失 . 也许你被泄漏报告的位置误导了? vector :: push_back()不应该泄漏 .

    // Free the objects
    for (int i = 0; i < orig.size(); i++) {
        delete orig[i];
        orig[i] = 0;    // not necessary, but good defensive practice
    }
    

    对于这些情况,我还建议使用智能指针 .

    PS:不是我的业务,但这个算法在做什么?这肯定是很多载体......

相关问题