当变量超出范围但实际上需要变量超出范围时内存泄漏

时间:2018-04-22 21:50:23

标签: c++ memory-leaks

由于for循环中的向量,此代码导致内存泄漏。我目前意识到可以通过不在C ++中使用指针来避免这种情况。但是,我需要在代码中使用指针。这是我在C中的实际代码的等效(概念证明),其中我没有其他选项,但使用指针。我使用C ++来解决我的问题,因为它使得它更容易可视化。在我的实际代码中,我使用了来自TreeMap库的vector而不是HashMapqueue而不是Libgee。我不会写出我的实际代码,因为要理解它,我必须发布超过一千行代码,这使我的问题变得不可行。这是一个缩小的等价物,它以编程方式导致相同的内存泄漏问题并具有相同的逻辑。最后,我将使用队列(我的代码中的HashMap),直到用户决定再次运行循环来获取新值。我不能在循环之外声明containerVector的原因是每个{i}迭代需要每个containerVector不同。

TL;在循环外部需要在for循环内创建的DR变量,但引用会丢失并导致内存泄漏。变量需要作为指针。

在使用指针时,有没有办法避免内存泄漏?我事先并不知道我需要多少向量(这里代表我的C代码中的TreeMap),并且必须将它们创建为for循环中的指针。

#include <time.h>
#include <cstdlib>
#include <vector>
#include <queue>

using namespace std;


int main()
{
    srand(time(NULL));
    queue< vector<int>* >* containerQueue = new queue< vector<int>* >;

    // Unknown for loop size before running program
    for (int i = 0; i < rand() % 1000 + 10000; i++) {
        vector<int>* containerVector = new vector<int>;
        // Unknown nested loop size before running the program
        for (int j = 0; j < rand() % 100 + 50; j++) {
            // If a condition is met
            if (j % 2) {
                    // Add a value to the vector
                    containerVector->push_back(j);
            }
        }
        // Release memory pointed by containerVector if it was not used
        if (containerVector->empty()) delete containerVector;
        // Add the vector to the queue
        containerQueue->push(containerVector);
        // If containerVector were to be freed here, the memory leak issue is solved,
        // But containerQueue would then become useless
    }
    // Use containerQueue here
    // The values of containerVector are needed in this part of the code

    return 0;
}

0 个答案:

没有答案