![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Приветствую.
тема вроде избитая, но вот нашел интересный момент. исходные данные - VC++ 2008 SP1 код такого содержания
ошибка происходит в последней строчке, при выполнении выше Name = L"default"; на сколько я понимаю , при компилировании строка помещается в область данных, и при условии len<=1 дается ссылка на эту область. тут видимо и должна происходить ошибка, ведь память вроде как и не выделялась но вот есть такой момент запускаю этот код на WinXP SP3 хоть под отладчиком, хоть уже в релизе - все как часы работает. Но вот стоит запустить это на WinXp SP2 (не на всех компах срабатывает) , либо на Win7 (опять же через раз ) то выскакивает ошибка "Runtime Error! ...." да и когда тестировал в отладчике на win7 ошибка не возникала, соберу релиз - появилась. пересоберу релиз без изменений - работает. тут соответственно вопрос мой код все таки некорректен? или это уже ошибка компилятора/библиотек которые то корректно отрабатывают удаление памяти, то некорректно |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Лично я считаю, что должно быть так:
Вы нигде не выделяете память и пытаетесь потом что-то удалить. И если пару раз "прокатило", это не значит, что так можно ![]() Это сообщение отредактировал(а) artsb - 15.1.2010, 09:45 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
artsb,
спасибо за пример, я предполагал по другом это решить. но у тебя решение лучше. ну пару раз прокатило - но оно прокатывало то интересно как то - на разных компах по разному. у себя на компе я ни разу как не пытался не мог заставить появится ошибке. а уж на win7 через раз. у меня стойкое впечатление, что эту ситуацию по разному обрабатывают разные версии ситемных библиотек. или компилятор |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Наверное код нужно подправить
![]()
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
Dem_max,
в моем случае твой вариант не вариант. в процедуре rGetValue идет чтение строкового значения из реестра. а оно может быть по размеру любым. по этому выделение памяти идет по факту. |
|||
|
||||
artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
У меня ни разу не прокатило ![]() По поводу вашего случая. ИМХО в этом случае, компилер смотрит что строка константная и пихает её в ресурсы, а после этой операции:
в Name хранится указатель на строку, которую вы не создавали. А потом вы пытаетесь её удалить ![]() В этом случае, нужно убрать
и должно работать. ИМХО ЗЫ поправьте если что ![]() -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
artsb,
все правильно говоришь. но вот работало у меня. хотя я уже ни в чем не уверен. вечером еще раз проверю на win7 |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Значит в процедуре выделяется память ?
Все верно. Для новичка эта вещь не очевидная, если он ее не поймет то дальше можеть быть крах программы. И человек просто запарится искать свой косяк. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
||||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
CTapMex, ну вы понимаете, что в функции не может выделиться память для Name? Вы передаёте нулевой указатель и все. Память выделяется под указатель, который является параметром функции. Т.е.
Это сообщение отредактировал(а) artsb - 15.1.2010, 12:18 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
ну, вы полезли уже глубоко.
вот сама функция
|
|||
|
||||
artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Тем не менее в тему. амперсанд здесь не нужен. И вы нигде не освобождаете Data. Добавлено @ 12:39 Пробуйте так:
Добавлено @ 12:41 А юзать так:
Это сообщение отредактировал(а) artsb - 15.1.2010, 13:07 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
CTapMex |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
вот про удаление - да, не заметил. спасибо.
да, так лучше будет . спасибо а про бред - твой самый первый вариант решения тут подойдет Это сообщение отредактировал(а) CTapMex - 15.1.2010, 15:20 |
||||||
|
|||||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 1 Всего: 64 |
Если вы проверяете удалось ли что-то получить после вызова rGetValue, то лучше так:
а от len можно вообще избавиться. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
CTapMex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 20.2.2007 Репутация: нет Всего: нет |
еще раз спасибо
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |