![]() |
|
Модераторы: bsa |
![]()
|
|
| jimbo |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
Привет всем.
У меня следующий вопрос. вот кусок кода
При повторном возвращении к этому коду в одном процессе это вызывет ошибку BLOCK_TYPE_IS_VALID и т.д. Я исправил ее путем замены кода на
то есть была ошибка повторного удаления буфера. Поясняю, в моей функции класса, она рекурсивна, считался путь к файлу. Результат записывался в A.buf. Проверка длин происходит в том случае, если файл моя функция не нашла. Деструктор класса написан так:
Отсюда вопрос - почему ошибка исправилась и вообще почему она происходила, если в обоих случаях удаления буфера была проверка на ноль? Или при удалении экземпляра класса помимо деструктора вызывается еще что-то системное, не знающее что уже буфер удалеН? --------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
||||||
|
|||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
На вскидку (не видя всего вцелом):
При повторном обращение к коду если str == NULL код if(strlen(str)!=A.size) может вызвать нарушение доступа |
|||
|
||||
| jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
Спасибо за ответ!
strlen(str) присутствует в обеих частях кода, и работающего и неработающего. И это также отсекается тем, что фуункция .func() не возвращает ноль никогда. --------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Тогда другое предположение:
strlen вызывается к "мусорной" строке, что тоже бывает не очень хорошо. Кстати, а зачем явно указывать this? |
|||
|
||||
| jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
метод класса func не возвращает 0 никогда=(
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
А как выделяет память метод func?
|
|||
|
||||
| Acer |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 652 Регистрация: 5.9.2007 Где: UA::DN Репутация: нет Всего: 8 |
func() возвращает указатель на buf ?
Добавлено через 12 минут и 33 секунды Сначала удаляется память, на которую указывает str
(до деструктора), а потом в деструкторе попытка очистить ту же самую область памяти
В данном случае лучше делать так(если я правильно понял)
|
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
jimbo, из твоего кода мало что понятно. Кроме того, что скорее всего ты изменил верный вариант на неверный. Представь содержимое метода MyClass::func().
Почему не воспользовался std::string? |
|||
|
||||
| jimbo |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 18.6.2009 Где: Южно-Сахалинск Репутация: нет Всего: нет |
FindFileOnServer - это есть "из примера" MyClass::func(); string я потом использовать подумал Но вопрос решен. Я че-то протупил жестко и уже даже когда писал пример! То что происходило удаление два раза я знал. я не понимал откуда оно, теперь все ясно. была одна область памяти и 2 указателя на нее.. и сначала я удалял по одному указателю, потом по второму - СПАСИБО Acer!! Как я сам не увидел - фиг знает)) Anikmar к мусорной строке strlen обращаться никак не может - это видно по возвращаемому значению MyClass::func(); Использую this я, потому что если много членов в классе, студия находит нужный по нескольким первым символам - не приходится полностью писать. (ctrl+пробел). А так не вижу разницы указывать this или нет, может код будет лучше пониматься путем отделения членов класса и локальных переменных. Это сообщение отредактировал(а) jimbo - 28.9.2009, 15:04 --------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |