C++ 为什么这段代码有内存泄漏?

C++ 为什么这段代码有内存泄漏?,c++,pointers,dynamic,memory-leaks,C++,Pointers,Dynamic,Memory Leaks,我检查了每一行,但找不到我忘记删除的地方。我在这个网站上找到了AllocateDynamicArray和FreeDynamicArray代码,并假设它是正确的。我将尽快提供valgrind输出。任何帮助都将不胜感激 template <typename T> T **AllocateDynamicArray(int nRows, int nCols) { T **dynamicArray; dynamicArray = new T*[nRows]; for

我检查了每一行,但找不到我忘记删除的地方。我在这个网站上找到了
AllocateDynamicArray
FreeDynamicArray
代码,并假设它是正确的。我将尽快提供valgrind输出。任何帮助都将不胜感激

template <typename T>
T **AllocateDynamicArray(int nRows, int nCols) {
    T **dynamicArray;

    dynamicArray = new T*[nRows];
    for (int i = 0; i < nRows; i++) {
        dynamicArray[i] = new T [nCols];
        for (int j = 0; j < nCols; j++) {
            dynamicArray[i][j] = 0;
        }
    }
    return dynamicArray;
}


template <typename T>
void FreeDynamicArray(T** dArray, int nRows) {
    for (int i = 0; i < nRows; i++) {
        delete[] dArray[i];
    }
    delete[] dArray;
}

int main(int argc, char* argv[]) {

    int numOfComps = 1;
    int** input = AllocateDynamicArray<int>(rowNo, 4);
    while (calculateAvgTime(false) > maxAvgTime) {
        numOfComps++;
    }
    FreeDynamicArray(input, rowNo);
    return EXIT_SUCCESS;
}


double calculateAvgTime(bool print) {
    double waitingTime = 0;
    int* computers = new int[numOfComps];
    for (int i = 0; i < numOfComps; i++) {
        computers[i] = 0;
    }
    int** infoList = AllocateDynamicArray<int>(numOfComps, 2);

    //some code related to computers and infoList

    double waitingTime /= (double) (rowNo);
    FreeDynamicArray(infoList, numOfComps);
    delete[] computers;
    return waitingTime;
} 

calculateAvgTime
中,您可以在
计算机中分配一个数组,但只释放一个项目。使用
new[]
时,请使用
delete[]


更妙的是,只需使用
向量
,即可看到该程序的内存管理问题消失。

calculateAvgTime
中,您在
计算机
中分配了一个数组,但只释放了一个项目。使用
new[]
时,请使用
delete[]



更好的方法是,只需使用
向量
并观察该程序的内存管理问题消失。

我不知道“rowNo”是在哪里定义的,因此如果您使用VS try get visual leak detector(),那么“FreeDynamicArray()”没有删除所有内存可能会有问题,它将帮助您跟踪正在泄漏的内存,并帮助您查明错误。

我不知道“rowNo”是在哪里定义的,因此如果您使用VS try get visual leak detector(),则“FreeDynamicArray()”没有删除所有内存可能会有问题,它将帮助您追踪哪些内存泄漏,并帮助您查明错误。

您的代码存在内存泄漏,因为您使用的是手动内存管理。不要那样做。你是用C++编程的,所以使用RAII管理资源。既然您使用的是动态数组
std::vector
就是您应该使用的,那么如何使用RAII?有什么建议吗?为什么你认为你有内存泄漏?引用内存泄漏工具告诉您的内容。我们仍在等待你承诺的Valgrind产量。这个工具没有告诉你泄漏的内存是在哪里分配的吗?我意识到这个错误不是因为我上面发布的代码,所以问题解决了。谢谢。泄漏不在张贴的代码中;一旦我修复了语法错误,它就会在valgrind中干净地运行。正如我们从回溯中看到的,泄漏来自一个名为
Heap
的类,该类与发布的代码无关。也许您可以发布一个测试用例来演示泄漏。您的代码存在内存泄漏,因为您使用手动内存管理。不要那样做。你是用C++编程的,所以使用RAII管理资源。既然您使用的是动态数组
std::vector
就是您应该使用的,那么如何使用RAII?有什么建议吗?为什么你认为你有内存泄漏?引用内存泄漏工具告诉您的内容。我们仍在等待你承诺的Valgrind产量。这个工具没有告诉你泄漏的内存是在哪里分配的吗?我意识到这个错误不是因为我上面发布的代码,所以问题解决了。谢谢。泄漏不在张贴的代码中;一旦我修复了语法错误,它就会在valgrind中干净地运行。正如我们从回溯中看到的,泄漏来自一个名为
Heap
的类,该类与发布的代码无关。也许您可以发布一个测试用例来演示泄漏。对于简单类型的指针,例如“int”、“char”、“short”,不带[]的delete是可以的。@ciphor:不,不是。按照标准,它是UB,在很多实现中会崩溃。感谢您提醒缺少的括号,我已更正,但它仍然存在内存泄漏。对于简单类型的指针,例如“int”、“char”、“short”、删除而不使用[]是可以的。@ciphor:不,不是。根据标准,它是UB,在很多实现中会崩溃。感谢您提醒缺少的括号,我已经更正了,但它仍然存在内存泄漏。
==21109== 
==21109== HEAP SUMMARY:
==21109==     in use at exit: 1,344 bytes in 4 blocks
==21109==   total heap usage: 72 allocs, 68 frees, 11,752 bytes allocated
==21109== 
==21109== 336 bytes in 1 blocks are definitely lost in loss record 1 of 2
==21109==    at 0x4C28D27: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21109==    by 0x402159: Heap::Heap(int) (in /home/cs/c_turhan/bin/HW3/simulator/simulator)
==21109==    by 0x401977: calculateAvgTime(bool) (in /home/cs/c_turhan/bin/HW3/simulator/simulator)
==21109==    by 0x401792: main (in /home/cs/c_turhan/bin/HW3/simulator/simulator)
==21109== 
==21109== 1,008 bytes in 3 blocks are definitely lost in loss record 2 of 2
==21109==    at 0x4C28D27: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==21109==    by 0x402159: Heap::Heap(int) (in /home/cs/c_turhan/bin/HW3/simulator/simulator)
==21109==    by 0x401977: calculateAvgTime(bool) (in /home/cs/c_turhan/bin/HW3/simulator/simulator)
==21109==    by 0x401724: main (in /home/cs/c_turhan/bin/HW3/simulator/simulator)
==21109== 
==21109== LEAK SUMMARY:
==21109==    definitely lost: 1,344 bytes in 4 blocks
==21109==    indirectly lost: 0 bytes in 0 blocks
==21109==      possibly lost: 0 bytes in 0 blocks
==21109==    still reachable: 0 bytes in 0 blocks
==21109==         suppressed: 0 bytes in 0 blocks
==21109== 
==21109== For counts of detected and suppressed errors, rerun with: -v
==21109== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 6 from 6)