2012-04-18 16 views
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の出力です。 calculateAvgTime

==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) 
+1

手動メモリ管理を使用しているため、コードにメモリリークが発生しています。それをしないでください。あなたはC++でプログラミングしているので、RAIIを使ってリソースを管理してください。動的配列を使用するので、 'std :: vector 'は何を使うべきですか – Grizzly

+0

どうすればRAIIを使うことができますか?任意のヒント? –

+0

なぜメモリリークがあると思いますか?あなたのメモリリークツールがあなたに伝えるものを引用してください。あなたが約束したValgrindの出力を待っています。ツールは、漏れたメモリがどこに割り当てられたかを教えてくれませんか? –

答えて

5

、あなたはcomputersに配列を割り当てるが、あなたは、単一の項目のみを解放します。 new[]を使用する場合はいつでもdelete[]を使用してください。

さらに、vectorを使用して、このプログラムのメモリ管理の問題が表示されないようにしてください。

+0

シンプルタイプのポインタの場合(例: 'int'、 'char'、 'short'、[]なしの削除は問題ありません。 – ciphor

+3

@ciphor:いいえ、そうではありません。これは標準でUBであり、かなりの実装でクラッシュするでしょう。 – PlasmaHH

+0

不足している括弧を思い出させてくれてありがとう、私は訂正しましたが、まだメモリリークがあります。 –

0

'rowNo'が定義されている場所が表示されないため、「FreeDynamicArray()」でメモリをすべて削除していない可能性があります。また、VSを使用している場合は視覚漏れ検出器(here)どのメモリがリークされているかを追跡し、エラーを特定するのに役立ちます。

関連する問題