2016-08-17 23 views
0

我遇到内存泄漏问题和最小代码如下。我的编译器是VS2008。内存泄漏:验证块类型

//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_; 
     } 

    } 

} 

和主文件是

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

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

    return 0; 
} 

而错误或警报是

_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse));

在dbgdel.cpp线:52

因此,有什么错误?谢谢。

+6

认为在这个问题中的代码不能满足的要求[ MCVE。除非编辑这个问题,并提供[mcve],否则不可能有答案。 –

+1

'if(feature_vector _!= NULL)' - 你在使用什么编译器?如果'new []'失败,则引发'std :: bad_alloc'异常,并且不返回NULL。 – PaulMcKenzie

+0

请发布[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。第一个'if(feature_vector _!= NULL){delete [] feature_vector_; }'?在调用这个函数之前,'feature_vector_'初始化为'NULL'还是指向已分配缓冲区的指针,并且未正确删除? – MikeCAT

回答

0

当你删除指针你Memory_Leak_Test你不设置指针为NULL,所以你的析构函数会再次尝试删除它

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; // <<----- 
     } 

    } 

}