0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
||||||
1 | ||||||
Проблемы при работе с динамическим распределением памяти26.07.2011, 19:38. Показов 1500. Ответов 16
Метки нет (Все метки)
Здравствуйте! Возникла проблема при использовании динамической распределении памяти.
Вот код:
И ещё вопрос сюда же - в конце функции написал delete []zero; . Когда доходит до этой строчки выводит ошибку
0
|
26.07.2011, 19:38 | |
Ответы с готовыми решениями:
16
Shared_ptr и классы с динамическим распределением памяти Ошибка при работе с динамическим массивом Ошибка при работе с динамическим массивом Ошибка повреждения кучи при работе с динамическим стеком |
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,927
|
||||||
26.07.2011, 20:57 | 2 | |||||
Не совсем понятно что нужно, может так лучше?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
26.07.2011, 21:18 | 3 |
видимо, полагаете, что sizeof(zero) даёт размер выделенного блока памяти. Увы, это размер указателя (обычно 4 или 8 байт). Переносимых способов определить размер динамически выделенного блока нет. Размер надо запоминать самостоятельно (что можно увидеть у alexcoder)
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
||||||
26.07.2011, 21:26 [ТС] | 4 | |||||
Второй вопрос отпал - спасибо! Помогло, когда убрал квадратные скобки.
Но первый остаётся открытым. Я, конечно, не досмотрел, когда писал сообщение - спутал названия переменных. Должно быть так:
Смена sizeof(zero) на len+1 тоже. Нужно сделать так, чтобы массив zero размером len заполнился len(таким количеством) нулями. И больше ничего, потому что строки нужно конкатенировать. А в итоге получается, что zero заполняется в случае len = 11 вот этим "000000000000«««««««««««««««юоюою". Количество нулей в норме. А вот "«««««««««««««««юоюою" мешает - при конкатенации с buf_t получается ерунда вместо 16-разрядного числа.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
26.07.2011, 21:49 | 5 | |||||
Как раз с квадратными скобками правильно, а без них — нет.
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
|
26.07.2011, 22:16 [ТС] | 6 |
Спасибо, это помогло - zero[len] = '\0';
Хотя я уже это добавлял, но видимо, надо было до цикла вставить. Но почему-то вернулась проблема с delete [] zero; - выдаёт ту же ошибку. Почему может такое происходить?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
26.07.2011, 22:17 | 7 |
Показывай, что получилось.
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
||||||
26.07.2011, 22:30 [ТС] | 8 | |||||
Ошибку выдаёт такую: Причём, как я только что заметил - Если два раза нажать "Продолжить", то программа выполняется до конца с правильным результатом. Когда закомментировал строчку delete []zero; - выполнилась без ошибок.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
26.07.2011, 22:32 | 9 | |||||
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
||||||
26.07.2011, 22:42 [ТС] | 10 | |||||
Когда я переписал zero[len] = '\0'; , вернулась проблема с белибердой в zero.
Не могли бы вы подсказать, как мне переписать этот код:
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
26.07.2011, 22:46 | 11 | |||||
Я уже показывал. Но ещё раз, с уточнениями
Добавлено через 50 секунд Да, я увеличил len на 1.
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
|
26.07.2011, 23:10 [ТС] | 12 |
А, я сначала недопонял просто. Да, этот вариант без цикла тоже работает, но на delete всё-равно ругается
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
26.07.2011, 23:15 | 13 |
Если вставлено без изменений, то проблема где-то в другом месте. Она может быть даже не в этой функции.
0
|
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,927
|
|||||||||||
26.07.2011, 23:19 | 14 | ||||||||||
Я посмотрел функция, и насколько понял на входе двоичное число в виде массива, младшие значения по младшим адресам , а функция должна вывести младшие 16 разрядов числа.
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
|
27.07.2011, 00:49 [ТС] | 15 |
Нет, суть функции в другом. В общем это часть dll библиотеки для работы с dhcp сервером, он должен выдавать ip в виде 172.18.x.x, где x.x увеличивающийся на один с каждым запросом адрес - в двоичном виде соответственно 16 бит (ip адрес = 32 бита).
Данная функция tau как раз увеличивает ip на 1. А делает это так: 1) получает 16 бит предыдущего адреса(чтобы знать к чему прибавлять единицу) 2) переводит в десятичную СС 3) прибавляет 1 4) переводит обратно в двоичную и тут то вся проблема, если в пункт 1) пришло число вида, например "0000100011100110" (16 разрядов), то после пункта 4) мы получим "100011100111" (12 разрядов). Поэтому мне нужно дописать нули спереди. И я просто генерирую нужное количество и конкатенирую строки. Сейчас всё хорошо, но при выполнении delete [] zero выдаёт ошибку, описанную выше. Плюс ещё проблема в том, что я не могу передать этот массив в другую функцию с таким прототипом: void bintoip (char *x1,char *x2); используя такой вызов: bintoip(zero,x2); При выполнении любых действий с x1 в bintoip вызывает исключение: itoa делает наоборот - в позиции [0] записан старший разряд, в позиции [15] - малдший. Я понимаю, что всё выглядит мудрёно, но я буду очень благодарен, если мы найдём решение этой проблемы! Добавлено через 27 минут Это уже не актульно, в этом я разобрался. Осталось только разобраться в освобождении памяти.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
27.07.2011, 00:52 | 16 |
В принципе здесь несложно вообще избавиться от массива zero, но проблема не в нём, просто она на нём проявляется. А значит надо искать. Наверняка где-то ещё происходит выход за границу буфера, в результате чего целостность "кучи" нарушается.
0
|
0 / 0 / 0
Регистрация: 26.07.2011
Сообщений: 8
|
|
27.07.2011, 00:57 [ТС] | 17 |
Спасибо огромное!! Благодаря этим словам в голове всё прояснилось)) Я же делаю strcat(zero,buf_t);
Получается она к zero дописывает ещё buf_t - и получается выход за пределы. Эх, бывает же.. Спасибо большое вам обоим за помощь!
0
|
27.07.2011, 00:57 | |
27.07.2011, 00:57 | |
Помогаю со студенческими работами здесь
17
Ошибка с памятью при работе с динамическим двумерным массивом Ошибка при работе с двумерным динамическим массивом, созданным через функцию Проблемы при работе с файлами утечка памяти при работе с матрицей Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |