![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| ktototam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.7.2006 Репутация: нет Всего: нет |
Работаю с памятью через new(хотелось бы так и продолжать).
Массив при необходимости дополняется. Проблема в том что при работе происходит 'сбитие' указателя (как мне кажется) , но в разных местах сначала сбивалось при записи 8 строчки, после я закоментив пробдемную функцию таким же методом заполнял всю доступную память (доходило почти до 16 м, кстати как сделать больше?), после чего прблема сместилась на 23 строчку. видел пост _hunter про IsBadWritePtr/IsBadReadPtr , но не очень понял как с ними работать(неужели все new придётся проверять при каждом чтении и записи - пишет: Unhandled exception in 123.exe: 0xC0000005: Access violation - пишу на Visual C++ 6.0 - указатель обьявлен глобально и при обьявлении приравнен 0 - памать выделяю следующим образом: UN = new char**[KOL_ROWS]; for(int k=0;k<=KOL_ROWS;k++){UN[k] = new char*[KOL_COLM]; for(n=0;n<=KOL_COLM;n++){UN[k][n] = new char[LEN];}} //KOL_ROWS - число строк //KOL_COLM - число столбцов //LEN - максимальная длинна записи //UN обьявлен как char ***UN=0; за ранее спасибо! |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Что это значит? Память может только перераспределяться, при этом указатель на блок памяти вполне может измениться. Покажи код, которым ты "при необходимости дополняешь" массив. И код, который пишет в эти переменные. Из того факта, что у тебя что-то там сбивается то на 8 строке, то на 23, сложно сделать осмысленный вывод. Выпавший exception явно говорит о том, что ты влез в чужой блок. Из того, что при закомментированной функции программа не падала, не следует, что проблем с памятью нет. -------------------- ... |
|||
|
||||
| ktototam |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.7.2006 Репутация: нет Всего: нет |
Дополнение делаю следующим образом
если например было
и надо дописать ещё одну строку, то
запись делаю с помощью sprintf exception происходит при new (тех самых 8 или 23 сторках например) |
||||
|
|||||
| ultra |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 10.7.2006 Репутация: нет Всего: нет |
ты перед циклом выделяешь память на KOL_ROWS, а в цикле последний елемент будет KOL_ROWS+1. Из-за этого и проблемы. Вот так надо:
|
||||||
|
|||||||
| ktototam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.7.2006 Репутация: нет Всего: нет |
Наверно ultra прав, но проверить это я смогу только в понедельник
и почему тогда
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
indeterminate behavior: C не обещает, что программа свалится сразу после ошибки.
ultra, конечно, прав: ты не имеешь права обращаться не только к элементу KOL_ROWS+1, но и к KOL_ROWS: индексация начинается с 0, так что последний элемент - KOL_ROWS-1. Расширение массива требует 3 шагов: выделение нового блока нужного размера, копирование туда данных из старого, освобождения старого блока. Пользовался бы ты вектором... std::vector -------------------- ... |
|||
|
||||
| ktototam |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.7.2006 Репутация: нет Всего: нет |
дело в том что нулевой строкой идут заголовки и я не знаю сколько строк будет поэтому создаю новые строки когда получаю значения для них во временные переменные.
и всётаки почему
и прекрасно работало может всётаки можно добавлять записи не переписывая массив (например используя IsBadWritePtr/IsBadReadPtr) Это сообщение отредактировал(а) ktototam - 17.7.2006, 10:43 |
||||
|
|||||
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 6 Всего: 23 |
ktototam, ты же на C++ пишешь? Почему б STL не использовать? Или самому написать класс для массивов, чтобы память выделялась в конструкторе и убивалась деструктором автоматически? Сразу ошибок станет меньше.
Прошу прощения, что не по теме. Это сообщение отредактировал(а) NiJazz - 17.7.2006, 11:24 |
|||
|
||||
| ktototam |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 14.7.2006 Репутация: нет Всего: нет |
Спасибо, но
и кто знает как выделить компилятору памяти больше чем 16 м? |
|||
|
||||
| Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 4 Всего: 29 |
||||
|
||||
![]()
|
| Правила форума "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. |