![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| DPbIH |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 3.4.2007 Репутация: нет Всего: нет |
Такой вот код
При попытке расширить массив вываливается окошко debug assertation failed а именно не проходит следующий assert
pUserData - указатель на нулевой элемент массива и до попытке рэаллока он был валидный. Так какого ху? Спасибо за ответы,товарищи проггеры! |
||||
|
|||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: нет Всего: 60 |
||||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
||||
|
||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 6 Всего: 23 |
DPbIH, realloc вызывается в DLL? В таком случае, видимо, память изначально была выделена в самом exe и передана в DLL по указателю.
Я не помню точно где, но бытует утверждение, что realloc использовать не нужно. Извини, но объективно объяснить не могу, так как сам не пользуюсь CRT для работы с массивами и буферами вообще. Если нужно изменить размер буфера, обычно явно выделяют новый блок памяти, копируют туда содержимое старого буфера, затем старый буфер удаляют. Теоретически, realloc делает то же самое. Ты не смотрел в сторону STL? |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
1. объявление немного некорректное:
на самом деле должно быть:
как говорится почувствуйте разницу 2. пусть даже char** argv, что это значит? Что у нас имеется динамический массив указателей на непрерывные участки в памяти, притом никто не обещает что они непрерывно будут следовать друг за другом, а realloc работает с memory block. Это хорошо еще, что компилер хоть assert'ом по руками ударил. вот такого |
|||
|
||||
| DPbIH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 3.4.2007 Репутация: нет Всего: нет |
нет, не в DLL. Мне нужно создать массив, указывая размер через переменную. Вектор не катит, потому, что дальше этот масси мне нужно передать в функцию, которую писал не я, и которую переписывать нельзя. |
|||
|
||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
||||
|
||||
| DPbIH |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 3.4.2007 Репутация: нет Всего: нет |
сейчас сделал немного по-другому. Создал новый массив, а потом realloc"ом попытался задать ему нужный размер
а вот результат меня удивил!!! в результате выполнения следующего кода
получаю "Windows has triggered a breakpoint in winjectmaker.exe. This may be due to a corruption of the heap, and indicates a bug in winjectmaker.exe or any of the DLLs it has loaded. The output window may have more diagnostic information" А вот в окне "WATCH" при просмотре элементов массива, все нормально! newArgv[0] 0x3a1f3830 "d:\3w\bin\winjectmaker.exe" char * newArgv[1] 0x008b42af "D:\3w\app\winjectmaker\config\w.xml" char * newArgv[2] 0x008b42af "D:\3w\app\winjectmaker\config\winjectmaker.xml" char * newArgv[3] 0x008b6450 "d:\3w\app\winjectmaker\config\rtdbsave.xml" char * newArgv[4] 0x008b647b "d:\3w\app\winjectmaker\config\out.xml" char * |
||||
|
|||||
| zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
по поводу передачи вектора, можно воспользоваться тем, что элементы в нем обязаны храниться непрерывно:
Добавлено через 6 минут и 27 секунд ты понимаешь, что делаешь? sizeof(newArgv) == 4 (наверняка, зависит от платформы) newArgc - колличество аргументов в ком.строке плюс 2 мы все это перемножаем, и получаем колличество байт, которые надо выделить? |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 8 Всего: 154 |
Вот так лучше не делать, ты сначала выделяешь блок памяти через new, а потом передаешь его в realloc. В место new нужно вызывать malloc или realloc с параметром NULL. Добавлено через 1 минуту и 27 секунд а освобождать его free |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: нет Всего: 60 |
капец просто... Ошибка в каждой строке
Это сообщение отредактировал(а) Fazil6 - 25.10.2007, 12:34 |
||||
|
|||||
| DPbIH |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 3.4.2007 Репутация: нет Всего: нет |
realloc возвращает указатель на блок выделенной им памяти, все правильно, не пойму в чем проблема! Добавлено @ 13:20
почему? new = malloc + конструктор. Добавлено @ 13:24 2Fazil6
Реально не знал, что такое прокатывает!!!! Это сообщение отредактировал(а) DPbIH - 25.10.2007, 13:27 |
||||||
|
|||||||
| zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 12 Всего: 92 |
а я сразу не понял что ты там пытаешься сделать, зачем тогда new был? Запутать хотел? Получилось! Добавлено через 6 минут и 44 секунды а нафиг бы он нужен был такой new |
|||
|
||||
| DPbIH |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 3.4.2007 Репутация: нет Всего: нет |
капец йа креведко! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |