C++, Bad Pointer
Создалась ситуёвина, когда нужно удалить динамически создаваемый объект. Это просто, банально и т.д... Трудность началась тогда, когда программа его не инициализирует(по условию не должна), а деструктор как был так и есть -
Код:
if(pObj) delete pObj;
Пример дурацкий, но достаточно жизненный.
Код:
if(pObj != NULL) delete pObj;
не катит... Много чего уже перепробовал - не катит... Компилер VC++ 2008. Сил уже нет бороться, если кто знает - буду очень благодарен.
Давайте больше кода, или проверяйте все места где может выделиться память под pObj, или где он может проинициализироваться другим указателем.
Например, SEH под Windows может выглядеть так:
Код:
__try{ delete pObj; }
__except(EXCEPTION_EXECUTE_HANDLER){}
__except(EXCEPTION_EXECUTE_HANDLER){}
Или С++ исключение:
Код:
try{ delete pObj; }
catch(...){}
catch(...){}
Цитата: Нездешний
Исключения перехватывать не пробовал?
Исключения здесь не помогут, точнее помогут, но ими мы просто спрячем (а не решим) существующую ошибку. Как уже и сказал aks, необходимо искать где переприсваивается pObj.
а есть ещё умные указатели в библиотеке stl
А еще есть в boost и еще много где. Только чтож с того? )
Цитата: aks
А еще есть в boost и еще много где. Только чтож с того? )
ничего... просто жизнь упростят, если в самом объекте нигде не прописано что типа delete this;
Ну я так понял у автора же уже есть код и нужно найти баг. Поздно уже смартпоинтеры юзать. Или уж переходить полностью, а потом по новой тестить. )
Код:
pObj = new Object(...);
И вот если происходит так, то компилер начинает ругаться страшными словами, типа
Код:
Unhandled exception at 0x64bcbb30 (msvcp90d.dll) in App01.exe: 0xC0000005: Access violation reading location 0xcdcdcde9.
Мне нужен код, который проверяет, зодал и объект, и, если да, его удалял.
Ещё раз прошу прощения, за не корректно сформулированый вопрос.
Тогда при удалении сразу будешь видеть выделенна под него память и надо ли удалять или нет.
Код:
class Object{
public:
Object();
//....
private:
char* mStr;
};
public:
Object();
//....
private:
char* mStr;
};
дальше конструктор:
Код:
Object::Object()
{
//...
mStr = NULL;
}
{
//...
mStr = NULL;
}
далее существует вероятность вызова метода, где mStr инициализируется строкой, и, наконец, деструктор:
Код:
Object::~Object()
{
if(mStr != NULL) delete[] mStr;
// пробовал ещё вот так:
if(mStr) delete[] mStr;
// всё равно не то...(((
}
{
if(mStr != NULL) delete[] mStr;
// пробовал ещё вот так:
if(mStr) delete[] mStr;
// всё равно не то...(((
}
и вот вся вот эта конструкция не пашет.... Если mStr не инициализируется строкой, то всё падает. Ещё раз хочу сказать, что это VC++2008.....
Выложите ваш исходник. Попробую откомпилить у себя.
ЗЫ: отдельное спасибо за совет про NULL в конструкторе = )