| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > проблема с realloc(массив) |
| Автор: DPbIH 24.10.2007, 15:15 | ||||
Такой вот код
При попытке расширить массив вываливается окошко debug assertation failed а именно не проходит следующий assert
pUserData - указатель на нулевой элемент массива и до попытке рэаллока он был валидный. Так какого ху? Спасибо за ответы,товарищи проггеры! |
| Автор: zkv 24.10.2007, 16:07 |
уровень преподавания языка такой :( Я помню нечто подобное пытался провернуть когда-то, показывал преподу (преподавательнице вернее), та разводила руками, типа хз. |
| Автор: NiJazz 25.10.2007, 08:10 |
| DPbIH, realloc вызывается в DLL? В таком случае, видимо, память изначально была выделена в самом exe и передана в DLL по указателю. Я не помню точно где, но бытует утверждение, что realloc использовать не нужно. Извини, но объективно объяснить не могу, так как сам не пользуюсь CRT для работы с массивами и буферами вообще. Если нужно изменить размер буфера, обычно явно выделяют новый блок памяти, копируют туда содержимое старого буфера, затем старый буфер удаляют. Теоретически, realloc делает то же самое. Ты не смотрел в сторону STL? |
| Автор: zkv 25.10.2007, 08:28 | ||
| 1. объявление немного некорректное: на самом деле должно быть:
как говорится почувствуйте разницу 2. пусть даже char** argv, что это значит? Что у нас имеется динамический массив указателей на непрерывные участки в памяти, притом никто не обещает что они непрерывно будут следовать друг за другом, а realloc работает с memory block. Это хорошо еще, что компилер хоть assert'ом по руками ударил. вот такого |
| Автор: DPbIH 25.10.2007, 11:50 | ||
нет, не в DLL. Мне нужно создать массив, указывая размер через переменную. Вектор не катит, потому, что дальше этот масси мне нужно передать в функцию, которую писал не я, и которую переписывать нельзя. |
| Автор: zkv 25.10.2007, 11:52 |
так заведи собственные переменные и работай с ними, кто мешает? |
| Автор: DPbIH 25.10.2007, 12:03 | ||||
сейчас сделал немного по-другому. Создал новый массив, а потом 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 25.10.2007, 12:07 | ||||
по поводу передачи вектора, можно воспользоваться тем, что элементы в нем обязаны храниться непрерывно:
Добавлено через 6 минут и 27 секунд ты понимаешь, что делаешь? sizeof(newArgv) == 4 (наверняка, зависит от платформы) newArgc - колличество аргументов в ком.строке плюс 2 мы все это перемножаем, и получаем колличество байт, которые надо выделить? |
| Автор: Lazin 25.10.2007, 12:18 | ||
Вот так лучше не делать, ты сначала выделяешь блок памяти через new, а потом передаешь его в realloc. В место new нужно вызывать malloc или realloc с параметром NULL. Добавлено через 1 минуту и 27 секунд а освобождать его free |
| Автор: Fazil6 25.10.2007, 12:34 | ||||
капец просто... Ошибка в каждой строке
|
| Автор: DPbIH 25.10.2007, 13:16 | ||||||||||||
realloc возвращает указатель на блок выделенной им памяти, все правильно, не пойму в чем проблема! Добавлено @ 13:20
почему? new = malloc + конструктор. Добавлено @ 13:24 2Fazil6
Реально не знал, что такое прокатывает!!!! |
| Автор: zkv 25.10.2007, 13:47 |
а я сразу не понял что ты там пытаешься сделать, зачем тогда new был? Запутать хотел? Получилось! Добавлено через 6 минут и 44 секунды а нафиг бы он нужен был такой new |
| Автор: DPbIH 25.10.2007, 13:57 | ||
капец йа креведко! |