vector new內存溢出 delete操作

我用vector容器存放結構體變量
如果你的結構體定義成這樣
typedef struct A
{
A()
{
memset( this, 0, sizeof( A) );
}
A(const A& in)
{
memcpy( this, &in, sizeof( A) );
}
bool isSame(const A& in)
{
return strcmp( h, in.h) == 0;
}
bool isSame(const char* h, const char* c)
{
return ( strcmp( this->h, h) == 0 && strcmp( this->c, c) == 0 );
}

bool operator==(const A& in)
{
return ( strcmp( h, in.h) == 0 && strcmp( c, in.c) == 0);
}

bool operator!=(const A& in)
{
return !( *this == in );
}
char h[128];
char c[128];
int a;
std::vector<CString> w;
}A,*PA

類中
class B: public CDialog
{
public:
std::vector<PA> m_A;
}

.cpp

PA  p = new A;
m_A.push_back(p);

如果這是直接釋放內存delete p;p=NULL;是不可以的;m_A.push_back(p);只是將p的指針傳進容器中,是指向同一塊內存的,
如果這時將p釋放掉,那麼容器指向的將是野指針

一個辦法是在.h中再定義一個容器
std::vector<PA>   m_Point;
.cpp中每當new一個時就將他放進:
PA  p = new A;
m_Point.push_back(p);
m_A.push_back(p);
然後再~B中
PA pa = NULL;
while( m_Point.size() > 0 )
{
pa= m_Point.front();
if ( NULL != pa)
{
m_Point.erase( m_Point.begin() );
delete pa;
pa= NULL;
}
}
當然 你也可以就直接釋放m_A,而不用存到m_Point中,如果遇到使用vector只是用作中間變量的話,就需要用到m_Point最後釋放一下。

.h
struct A
{};
std::vector<A *> pPoint;
.cpp
A *pA=new A;
pPoint.push_back( pA );
析構
A *pA = NULL;
while( pPoint.size() > 0 )
{
pA = pPoint.front();
if ( NULL != pA )
{
pPoint.erase( pPoint.begin() );
delete pA;
pA = NULL;
}
}


剛剛學習,歡迎指教



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章