2016-08-17 3 views
0

Ich trete ein Speicherverlustproblem und der Mindestcode wie folgt. Mein Compiler ist VS2008.Speicherleck: Verify Block Typ

//haar.h 
#include "stdio.h" 
#include "stdlib.h" 

class HaarClass 
{ 
public: 

    HaarClass(void); 
    ~HaarClass(void); 

    void Memory_Leak_Test(); 

private: 
    long* feature_vector_; 
}; 


HaarClass::HaarClass(void) 
{ 
    feature_vector_ = NULL; 
} 

HaarClass::~HaarClass(void) 
{ 
    if (feature_vector_ != NULL) { 
     delete[] feature_vector_; 
    } 
} 

void HaarClass::Memory_Leak_Test(){ 

    if (feature_vector_!=NULL) { 
     delete[] feature_vector_; 
    } 

    for (int i=0; i<10; i++) 
    { 
     feature_vector_ = new long[100]; 

     if (feature_vector_!=NULL) { 
      delete[] feature_vector_; 
     } 

    } 

} 

Und die Hauptdatei ist

//main.cpp 
#include <cstdio> 
#include "haar.h" 

int main() 
{ 
    HaarClass a; 
    a.Memory_Leak_Test(); 

    return 0; 
} 

Und der Fehler oder die Warnung ist

_ASSERTE (_BLOCK_TYPE_IS_VALID (pHead-> nBlockUse));

in dbgdel.cpp Line: 52.

Was also ist der Fehler? Vielen Dank.

+6

Der Code, der in dieser Frage gezeigt hat nicht den Anforderungen eines erfüllen [ mcve]. Wenn diese Frage nicht bearbeitet wird und ein [mcve] bereitgestellt wird, ist keine Antwort möglich. –

+1

'if (feature_vector _! = NULL)' - Welchen Compiler benutzen Sie? Wenn 'new []' fehlschlägt, wird eine 'std :: bad_alloc' Ausnahme ausgelöst, und es wird kein NULL zurückgegeben. – PaulMcKenzie

+0

Bitte veröffentlichen Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve). Was ist der Zweck des ersten 'if (feature_vector _! = NULL) {delete [] feature_vector_; } '? ist 'feature_vector_' initialisiert auf' NULL' oder Zeiger auf Puffer reserviert und nicht ordnungsgemäß gelöscht, bevor diese Funktion aufgerufen wird? – MikeCAT

Antwort

0

Wenn Sie den Mauszeiger in Ihrem löschen Memory_Leak_Test Sie nicht setzen Sie den Zeiger auf NULL, damit Ihr destructor wird es versuchen, wieder zu löschen

void HaarClass::Memory_Leak_Test(){ 

    if (feature_vector_!=NULL) { 
     delete[] feature_vector_; 
    } 

    for (int i=0; i<10; i++) 
    { 
     feature_vector_ = new long[100]; 

     if (feature_vector_!=NULL) { 
      delete[] feature_vector_; 
      feature_vector = NULL; // <<----- 
     } 

    } 

}