Chopin2001 Ответов: 0

АТЛАСЕРТ[ nrefs ! = 0 ] ошибка, когда я закрываю программу.


У меня есть графическая программа Windows на MDI, MFC, и документ имеет объект "wxr".
WXR имеет CtypedPtrList<CPtrList, CBackground *> OBList.
OBList* m_pList;
А у CBackground есть члены CString.
CString					m_projectPathName;
CString					m_projectName;

В программе есть ошибка при закрытии программы во время отладки.
имеет ли эта ошибка отношение к объекту CString? Я надеюсь это знать.
Орден разрушителей таков, как вы знаете...
~Document() ->> ~WXR() ->> ~CBackground()
вызовите стек ls вот так.
CStringData::Release() строка 86
..
CBackground::~CBackground() конец линии разрушителя
WXR::~WXR() // положение delete backgroundDestroyer

Что я уже пробовал:

WXR::~WXR()
{
....
пос = m_pList.GetHeadPosition();
while(pos != NULL){
удалить m_pList.GetNext(pos); // <<== точка ошибки. просмотр стека вызовов
}
m_pList.Метод removeall();
....
}

//CBackground
CBackground::~CBackground()
{
ПОЗИЦИЯ = NULL;
if(pBuf != NULL) // BYTE* pBuf;
pBuf = NULL;
}
//И CStringData::Release() Строка 86
структура cstringdata в
{
.....
void Release() throw()
{
ATLASSERT( nRefs != 0 ); << == ошибка точечной отладки! просмотр стека вызовов

if( _InterlockedDecrement( &nRefs ) <= 0 )
{
pStringMgr->бесплатно( это );
}
}

Спасибо, Что Уделили Мне Время!

Richard MacCutchan

Либо ваша строка CString была повреждена, либо она уже была каким-то образом выпущена. Вам нужно будет еще немного проследить свой код, чтобы узнать, где это происходит.

Chopin2001

Спасибо Р. Маккатчану.
Но, как вы можете видеть, я не вводил члены CString в ~Background (), потому что они не являются указателями. Я не понимаю, почему это произошло.

Richard MacCutchan

Извините, я не понимаю, что это значит. Ошибка понятна, кто-то пытается освободить объект более одного раза.

0 Ответов