2017-06-23 19 views
1

腐敗我有給定爲的malloc()由存儲器寫入int陣列僅對特定量

*** Error in `./match': malloc(): memory corruption: 0x0000000001036470 *** 
Aborted (core dumped) 

奇怪發生這種情況不具有約30-40要素的輸入之前在我的代碼的存儲器損壞。 因爲我無法弄清楚發生了什麼,所以我做了一些研究,並認爲valgrind是個不錯的選擇。我很新進入這個讓我通過兩個選項(不知道的一個有意義的),這點在後面的代碼行的valgrind跑:

void match(vector<APD> apdvec_database, const char* OUTPUTFILE, bool EXTRACT_APD_VALUE) 
{ 
    (...) 
    const int N = apdvec_database.size(); 
    vector<vector<double> > cost (N, vector<double>(N,0)); 
    (...) 
    // Calculate amount of edges 
    double number=0; 
    double n=N; 
    double k=2; 

    number=binom(n, k); 

    // convert edges 
    int node_num; 
    long int edge_num; 
    int* edges; 
    double* weights; 
    node_num=N; 
    edge_num=(int)number; 
    [line 561:]  edges = new int[2*edge_num]; 
    weights = new double[edge_num]; 

    cout << "\t\t " << node_num << " APDs and " << edge_num << " edges calculated" << endl; 

    int e=0; 
    for(size_t i = 0; i<apdvec_database.size(); i++) 
    { 
     for(size_t j = 0; j<apdvec_database.size(); j++) 
     { 
      if(i!=j) 
      {  
       // Assign edges among themselves 
    [line 575:]   edges[2*e] = (int)i; 
       edges[2*e+1] = (int)j; 

       // Use only triangular matrix with diagonals 
       if(j>i){ weights[e] = (double)cost[i][j];} 
       else{ if((int)+(int)j<node_num) weights[e] = (double)cost[i][j]; } 
       e++; 
      } 
     } 
    } 

由於輸出標誌着我通過[線]在兩個特定的行開頭:輸出爲:

Valgrind的選擇:--tool = MEMCHECK --leak檢查= YES

==24195== at 0x40D5CE: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:575) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== Address 0x8be5a38 is 0 bytes after a block of size 11,448 alloc'd 
==24195== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==24195== by 0x40D4A6: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:561) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== 
==24195== Invalid write of size 4 
==24195== at 0x40D5D2: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:576) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== Address 0x8be5a3c is 4 bytes after a block of size 11,448 alloc'd 
==24195== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==24195== by 0x40D4A6: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:561) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== 
==24195== Invalid write of size 8 
==24195== at 0x40D607: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:580) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== Address 0x158e86c8 is 0 bytes after a block of size 11,448 alloc'd 
==24195== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==24195== by 0x40D4D3: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:562) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== 
==24195== Invalid write of size 8 
==24195== at 0x40D5EA: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (match.cpp:579) 
==24195== by 0x410866: main (match.cpp:680) 
==24195== Address 0x158e87a0 is 128 bytes inside a block of size 184 free'd 
==24195== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==24195== by 0x508A5B8: THashList::Delete(char const*) (THashList.cxx:199) 
==24195== by 0x5515ACF: TDirectoryFile::Close(char const*) (TDirectoryFile.cxx:562) 
==24195== by 0x550A549: TFile::Close(char const*) (TFile.cxx:935) 
==24195== by 0x410623: database_irradiated(char const*, bool, std::vector<APD, std::allocator<APD> >&, double&) (match.cpp:317) 
==24195== by 0x410820: main (match.cpp:655) 
==24195== 

Valgrind的選項:-fno直插

==23041== Invalid write of size 4 
==23041== at 0x416D17: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== Address 0x8be5a38 is 0 bytes after a block of size 11,448 alloc'd 
==23041== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23041== by 0x416C6E: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== 
==23041== Invalid write of size 4 
==23041== at 0x416D1B: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== Address 0x8be5a3c is 4 bytes after a block of size 11,448 alloc'd 
==23041== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23041== by 0x416C6E: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== 
==23041== Invalid write of size 8 
==23041== at 0x416D72: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== Address 0x158e86c8 is 0 bytes after a block of size 11,448 alloc'd 
==23041== at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23041== by 0x416C9B: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== 
==23041== Invalid write of size 8 
==23041== at 0x416D45: match(std::vector<APD, std::allocator<APD> >, char const*, bool) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417AA9: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== Address 0x158e87a0 is 128 bytes inside a block of size 184 free'd 
==23041== at 0x4C2C2BC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23041== by 0x508A5B8: THashList::Delete(char const*) (THashList.cxx:199) 
==23041== by 0x5515ACF: TDirectoryFile::Close(char const*) (TDirectoryFile.cxx:562) 
==23041== by 0x550A549: TFile::Close(char const*) (TFile.cxx:935) 
==23041== by 0x417901: database_irradiated(char const*, bool, std::vector<APD, std::allocator<APD> >&, double&) (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== by 0x417A6D: main (in /home/ben/analysis/APDs/match/Combine/match) 
==23041== 

有趣的是,通過valgrind程序不會卡住。不會拋出malloc(),而是以合理的輸出成功結束。

+0

我假定它已連接https://www.tutorialspoint.com/cplusplus/cpp_dynamic_memory.htm。也許我知道了。 – Ben

+1

請提供一個[mcve],這個幫助你自己調試的方法很長 –

+0

剛剛創建了一個最小的例子,並且意識到只有valgrind突出顯示的行不會發生。首先要弄清楚,該怎麼做產生錯誤..編輯:有趣的是,我上傳了兩個例子:https://github.com/DeLaRiva/Code其中一個(最小)只是valgrind所指向的所有代碼,但沒有錯誤發生。在Minimal2中,我包含了所有要讀入數據的東西,然後通過將數組中的值分配給一個數組,從而發生錯誤。你能看看嗎?非常感謝你! editedit:代碼與Cern ROOT鏈接。 – Ben

回答

0

我明顯忘記在這裏進一步評論:不過,我必須清楚地聲明每個變量。可能有衝突,因爲我包含了Cern ROOT框架。但是,無論如何通過小心地聲明每個變量來解決這個問題。