1

すべての行をチェックしましたが、削除を忘れた場所が見つかりませんでした。このサイトでコードを見つけAllocateDynamicArrayFreeDynamicArrayコーディングし、それが正しいと思います。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;
} 

以下は、valgrind の出力です。

==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)
4

2 に答える 2

5

ではcalculateAvgTime、 で配列を割り当てますcomputersが、1 つの項目のみを解放します。を使用するdelete[]たびに使用しますnew[]

さらに良いことに、を使用して、vectorこのプログラムのメモリ管理の問題が消えるのを見てください。

于 2012-04-18T15:22:50.873 に答える
0

「rowNo」が定義されている場所が表示されないため、「FreeDynamicArray()」がすべてのメモリを削除しないことに問題がある可能性があります。また、VS を使用している場合は、視覚的なリーク検出器 (ここ) を取得してみてください。リークされているメモリを追跡し、エラーを特定するのに役立ちます。

于 2012-04-18T16:22:14.767 に答える