Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять поврежденная страница памяти, на этот раз в деструкторе 
:(
    Опции темы
Royan
  Дата 7.7.2004, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Опять фигня какая-то:

Имеется
Цитата
//CMyStrFormat.h
class CMyStrFormat{
  HLOCAL hFormattedStr;
  LPSTR szFormattedStr;
};

Цитата
//CMyStrFormat.h
class CMyStrFormat{
  HLOCAL hFormattedStr;
  LPSTR szFormattedStr;
};

//CMyStrFormat.cpp

#include "CMyStrFormat.h"
CMyStrFormat::CMyStrFormat(){
 
this->szFormattedStr = NULL;
}

CMyStrFormat::~CMyStrFormat(){
  LocalUnlock(
this->hFormattedStr);
 
try{
   LocalFree(
this->hFormattedStr);//Беда или здесь
 
}catch(...){
    DWORD dw=::GetLastError();
  }
 
//delete this->szFormattedStr;//или здесь
}

LPSTR CMyStrFormat::foo(LPSTR szStr){

 
this->hFormattedStr = LocalAlloc(LHND, sizeof(CHAR) * nTrimmedStrLen);
 
this->szFormattedStr = (LPSTR)LocalLock(this->hFormattedStr );

 
//this->szFormattedStr = new CHAR[nTrimmedStrLen];

 
return szFormattedStr;
}


Поясню, если воcпользоавться стандартными операторами new/delete[] то возникает сообщение о том что "поврежден блок перед №блока"

конкретнее валится вот этот фрагмент из файла dbgheap.c:
Цитата
/* check no-mans-land gaps */
           
if (!CheckBytes(pHead->gap, _bNoMansLandFill, nNoMansLandSize))
                _RPT3(_CRT_ERROR, "DAMAGE: before %hs block (#%d) at 0x%p.\n",
                    szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
                    pHead->lRequest,
                    (BYTE *) pbData(pHead));

Если пользовать комбинацию функций LocalAlloc/.../.../LocalFree то в момент вызова в деструкторе LocalFree вылетает исключение по какому-то безумному адресу и даже блок catch(...) не может его поймать и что делать и как быть ?

Это сообщение отредактировал(а) Royan - 7.7.2004, 12:42


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Олег М
Дата 7.7.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Да беда как раз там и вообще везде. Перед удалением надо проверять hFormattedStr на нулл. А разве LokalFree должна вызывать исключение. Вроде просто возвращает труе или фалсе. И нафига ты везде this-> пишешь?
PM MAIL ICQ   Вверх
Royan
Дата 7.7.2004, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



hFormattedStr не NULL, это 100%, на самом деле удаление с помощью delete[] у меня происходит с проверкой, поэтому это не есть причина. И отладчик совершенно четко показывает значение внутри Такое сообщение выползает (насколько я понимаю) когда что-то остается не удаленным из выделенного динамически, а деструктор уже вызван.

this-> пишу чтобы было одназначно, а на самом деле дело привычке, мне так удобнее. smile.gif


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
Олег М
Дата 7.7.2004, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата

Если пользовать комбинацию функций LocalAlloc/.../.../LocalFree то в момент вызова в деструкторе LocalFree вылетает исключение по какому-то безумному адресу и даже блок catch(...) не может его поймать и что делать и как быть ?

Кетч его по-любому не поймает, потому-что там системные исключения. Посмотри __try __except
http://msdn.microsoft.com/library/default....dler_syntax.asp
Но проблема у тебя в чём-то другом. new и delete дожны работать

PM MAIL ICQ   Вверх
Олег М
Дата 9.7.2004, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Попробуй так:
delete[] this->szFormattedStr;
Добавлено @ 15:49
А ты вдругом месте нигде szFormattedStr или указатель на неё не удаляешь?
PM MAIL ICQ   Вверх
Royan
Дата 9.7.2004, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: нет
Всего: 15



Цитата
delete[] this->szFormattedStr;


Пробовал, все равно тоже самое.

Цитата
А ты вдругом месте нигде szFormattedStr или указатель на неё не удаляешь?


Нет инициализация нулем происходит в конструкторе, присвоение адреса с выделенной памятью только внутри foo(), удаление внутри деструктора ....

Я вот тут подумал а может это происходит в таком случае:

Цитата
LPSTR szFormattedStr = NULL;
szFormattedStr  =
new CHAR[2];
szFormattedStr[2];
//Портим соседний байт, который не выделяли
delete [] szFormattedStr;// И вот тут ловим эту самую ошибку


Жаль сейчас не могу проверить версию, только когда до дома доползу... для достоверности надо работать на VS.NET 2003


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.