Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++, Bad Pointer

12K
13 октября 2008 года
St0p
59 / / 15.04.2007
Товарищи, выручайте =)
Создалась ситуёвина, когда нужно удалить динамически создаваемый объект. Это просто, банально и т.д... Трудность началась тогда, когда программа его не инициализирует(по условию не должна), а деструктор как был так и есть -
 
Код:
if(pObj) delete pObj;

Пример дурацкий, но достаточно жизненный.
 
Код:
if(pObj != NULL) delete pObj;

не катит... Много чего уже перепробовал - не катит... Компилер VC++ 2008. Сил уже нет бороться, если кто знает - буду очень благодарен.
240
14 октября 2008 года
aks
2.5K / / 14.07.2006
Из этого кода никакой информации не взять. ну кроме может того, что pObj не инициализируется NULL-ом.
Давайте больше кода, или проверяйте все места где может выделиться память под pObj, или где он может проинициализироваться другим указателем.
535
14 октября 2008 года
Нездешний
537 / / 17.01.2008
Исключения перехватывать не пробовал?
Например, SEH под Windows может выглядеть так:
 
Код:
__try{   delete pObj; }
__except(EXCEPTION_EXECUTE_HANDLER){}

Или С++ исключение:
 
Код:
try{   delete pObj;  }
catch(...){}
288
14 октября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: Нездешний
Исключения перехватывать не пробовал?



Исключения здесь не помогут, точнее помогут, но ими мы просто спрячем (а не решим) существующую ошибку. Как уже и сказал aks, необходимо искать где переприсваивается pObj.

11
14 октября 2008 года
oxotnik333
2.9K / / 03.08.2007
а есть ещё умные указатели в библиотеке stl
240
14 октября 2008 года
aks
2.5K / / 14.07.2006
А еще есть в boost и еще много где. Только чтож с того? )
11
14 октября 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: aks
А еще есть в boost и еще много где. Только чтож с того? )


ничего... просто жизнь упростят, если в самом объекте нигде не прописано что типа delete this;

240
14 октября 2008 года
aks
2.5K / / 14.07.2006
Ну я так понял у автора же уже есть код и нужно найти баг. Поздно уже смартпоинтеры юзать. Или уж переходить полностью, а потом по новой тестить. )
12K
14 октября 2008 года
St0p
59 / / 15.04.2007
Прошу прощения... Дело вот в том, что этот указатель живёт как мембер класса, и, если он инициализируется в один прекрасный момент - то всё нормально. НО. Существует вариант выполнения программы, когда этот указатель остаётся пустым. Тоесть, память под него не выделяется, тоесть нету
 
Код:
pObj = new Object(...);

И вот если происходит так, то компилер начинает ругаться страшными словами, типа
 
Код:
Unhandled exception at 0x64bcbb30 (msvcp90d.dll) in App01.exe: 0xC0000005: Access violation reading location 0xcdcdcde9.

Мне нужен код, который проверяет, зодал и объект, и, если да, его удалял.

Ещё раз прошу прощения, за не корректно сформулированый вопрос.
240
14 октября 2008 года
aks
2.5K / / 14.07.2006
Ну раз это член класса - инициализируй его в конструкторе NULL-ом.
Тогда при удалении сразу будешь видеть выделенна под него память и надо ли удалять или нет.
12K
14 октября 2008 года
St0p
59 / / 15.04.2007
всё равно как-то никак... Может я не такой, как все... Делаю так:
 
Код:
class Object{
public:
    Object();
    //....
private:
    char* mStr;
};

дальше конструктор:
 
Код:
Object::Object()
{
    //...
    mStr = NULL;
}

далее существует вероятность вызова метода, где mStr инициализируется строкой, и, наконец, деструктор:
 
Код:
Object::~Object()
{
    if(mStr != NULL) delete[] mStr;
// пробовал ещё вот так:
    if(mStr) delete[] mStr;
// всё равно не то...(((
}


и вот вся вот эта конструкция не пашет.... Если mStr не инициализируется строкой, то всё падает. Ещё раз хочу сказать, что это VC++2008.....
288
14 октября 2008 года
nikitozz
1.2K / / 09.03.2007
Выложите ваш исходник. Попробую откомпилить у себя.
12K
14 октября 2008 года
St0p
59 / / 15.04.2007
Всё, разобрался... Спасибо большое, бага сидела вообще в другой части программы... Видимо, я просто слишком устал.. Всем большое спасибо, извините меня ещё раз.

ЗЫ: отдельное спасибо за совет про NULL в конструкторе = )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог