|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.03.2012, 08:40 | #1 | ||
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
Ошибка при очистке памяти (язык Си): The pointer MUST come from the 'local' heap
Пишу на Microsoft Visual C++ 2010 Express. Файл с расширение .c, что позволяет компилятору интерпретировать код как написанный на языке Си.
Функция conc - функция с переменным числом параметров (признак окончания списка параметров - NULL). Объединяет строки в одну и возвращает указатель на объединенную строку. Объединенная строка создается в динамической памяти. main - динамически выделяет память под три строки, считывает их, выводит на экран и освобождает память. Программа вроде бы работает нормально, но на этапе очистки памяти в main (строка free(RS); ) возникает ошибка: Цитата:
Цитата:
Вот код: Код:
Последний раз редактировалось RomanA; 29.03.2012 в 08:45. |
||
29.03.2012, 09:09 | #2 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Потому что Вы выделили буфер в памяти длиной равной длине первой строки и после в него добавляете данные еще из двух других.
Код:
|
29.03.2012, 09:29 | #3 |
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
Хех... подправил цикл:
Код:
Но началось что-то странное: если на входе три строки "qwe", "asd", "zxc", то на выходе получается строка: "qwe══════¤¤¤¤ллллллллzxc" O_o Модифицировал код функции полностью: Код:
Хотя в этом случае выдает ту же ошибку, но уже посылает на другой кусок файла dbgheap.c: Код:
Последний раз редактировалось RomanA; 29.03.2012 в 09:51. |
29.03.2012, 09:48 | #4 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
Если Вы пишите не в блокноте, то все нормальные IDE могут останавливать выполнение дебажного кода в точке останова.
Вот и остановите выполнение на вызове conc(... и пошагово пройдите все инструкции, отслеживая состояние всех переменных. Работайте! |
29.03.2012, 09:59 | #5 |
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
В том то и дело, что прохожу.
malloc вместо 10 выделяет 24 байта... >_< Это вообще возможно??? |
29.03.2012, 10:10 | #6 |
Форумчанин
Регистрация: 11.07.2010
Сообщений: 914
|
На основании чего Вы решили что malloc/realloc выделяет больше памяти?
Уж не на основании ли того, что сразу после выделения памяти пробегаетесь по буферу функцией strlen и считаете ее возвращаемое значение длиной выделенного буфера? Она ведь при этом может вернуть все, что душе угодно. До первого встретившегося нуля в неинициализированной памяти. Учли это? PS. если проверить длину выделенного через malloc/realloc/calloc, то надо через _msize Последний раз редактировалось EUGY; 29.03.2012 в 10:14. |
29.03.2012, 10:16 | #7 | |
Пользователь
Регистрация: 10.08.2011
Сообщений: 30
|
Цитата:
Спасибо большое, что тратите время на такого идиота как я))) Вставил строку ConcString[0] = '\0'; после выделения памяти и все заработало без ошибок! |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка при очистке памяти | alexey_kip | Visual C++ | 3 | 12.02.2012 11:55 |
ошибка Edit при очистке значения Backspace-ом | voverrr | Общие вопросы Delphi | 14 | 08.02.2011 09:27 |
Модуль Local.h в C++/Интересует Русский язык | ISV-777 | Помощь студентам | 1 | 10.11.2010 20:08 |
Ошибка доступа памяти, при работе с принятой строкой. | Zeraim | Работа с сетью в Delphi | 11 | 26.01.2010 01:11 |
Ошибка при очистке динамического массива. | S_Yevgeniy | Помощь студентам | 4 | 24.12.2009 18:45 |