Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 1
Регистрация: 14.06.2012
Сообщений: 16

malloc, free error

07.07.2012, 18:07. Показов 2014. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Возникла следующая проблема. Код ниже:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string http_headers = "GET /index.asd HTTP/1.0 Host: 127.0.0.1:1101 User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Via: proxy X-Forwarded-For: ip Cache-Control: max-age=0 Connection: keep-alive ";
    size_t pos;
    string retval;
 
    pos = http_headers.find(" ");
    retval = http_headers.substr(0,pos);
    cout << retval << endl;
    if ( ( strcmp( retval.c_str(), "GET" ) == 0 ) || ( strcmp( retval.c_str(), "POST") == 0 ) ) {
        //cout << strcmp( retval.c_str(), "GET") << endl;
        char *httpretval = "HTTP/1.1 %d %s\r\nServer: WPanel HTTP Srv\r\n";
        char *ans;
        ans = (char*)malloc(sizeof(char)+1);
        sprintf( ans, httpretval, 200, "OK" );
        free(ans);
        cout << ans;
При выполнении получаю ошибку:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
GET
*** glibc detected *** ./main: free(): invalid next size (fast): 0x00000000013ab200 ***
======= Backtrace: =========
/lib64/libc.so.6[0x7f8614b28d7f]
/lib64/libc.so.6(cfree+0x4b)[0x7f8614b291db]
./main(__gxx_personality_v0+0x377)[0x400f7f]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x7f8614ad5994]
./main(__gxx_personality_v0+0x71)[0x400c79]
======= Memory map: ========
00400000-00402000 r-xp 00000000 00:b1 46632686                           /home/C++/test_new_server/main
00601000-00602000 rw-p 00001000 00:b1 46632686                           /home/C++/test_new_server/main
013ab000-013cc000 rw-p 00000000 00:00 0                                  [heap]
7f8614835000-7f86148b7000 r-xp 00000000 00:b1 16760930                   /lib64/libm-2.5.so
7f86148b7000-7f8614ab6000 ---p 00082000 00:b1 16760930                   /lib64/libm-2.5.so
7f8614ab6000-7f8614ab7000 r--p 00081000 00:b1 16760930                   /lib64/libm-2.5.so
7f8614ab7000-7f8614ab8000 rw-p 00082000 00:b1 16760930                   /lib64/libm-2.5.so
7f8614ab8000-7f8614c05000 r-xp 00000000 00:b1 16760852                   /lib64/libc-2.5.so
7f8614c05000-7f8614e05000 ---p 0014d000 00:b1 16760852                   /lib64/libc-2.5.so
7f8614e05000-7f8614e09000 r--p 0014d000 00:b1 16760852                   /lib64/libc-2.5.so
7f8614e09000-7f8614e0a000 rw-p 00151000 00:b1 16760852                   /lib64/libc-2.5.so
7f8614e0a000-7f8614e0f000 rw-p 00000000 00:00 0
7f8614e0f000-7f8614e1c000 r-xp 00000000 00:b1 16760843                   /lib64/libgcc_s-4.1.2-20080825.so.1
7f8614e1c000-7f861501c000 ---p 0000d000 00:b1 16760843                   /lib64/libgcc_s-4.1.2-20080825.so.1
7f861501c000-7f861501d000 rw-p 0000d000 00:b1 16760843                   /lib64/libgcc_s-4.1.2-20080825.so.1
7f861501d000-7f8615103000 r-xp 00000000 00:b1 17539317                   /usr/lib64/libstdc++.so.6.0.8
7f8615103000-7f8615302000 ---p 000e6000 00:b1 17539317                   /usr/lib64/libstdc++.so.6.0.8
7f8615302000-7f8615308000 r--p 000e5000 00:b1 17539317                   /usr/lib64/libstdc++.so.6.0.8
7f8615308000-7f861530b000 rw-p 000eb000 00:b1 17539317                   /usr/lib64/libstdc++.so.6.0.8
7f861530b000-7f861531d000 rw-p 00000000 00:00 0
7f861531d000-7f8615339000 r-xp 00000000 00:b1 16760882                   /lib64/ld-2.5.so
7f8615528000-7f861552b000 rw-p 00000000 00:00 0
7f8615536000-7f8615539000 rw-p 00000000 00:00 0
7f8615539000-7f861553a000 r--p 0001c000 00:b1 16760882                   /lib64/ld-2.5.so
7f861553a000-7f861553b000 rw-p 0001d000 00:b1 16760882                   /lib64/ld-2.5.so
7fff0e218000-7fff0e22d000 rw-p 00000000 00:00 0                          [stack]
7fff0e391000-7fff0e393000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted
Зачем мне нужен malloc? Потому, что при выполнении sprintf без malloc, и запуске программы выдает ошибку:

GET
Segmentation fault

На что gdb говорит:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(gdb) exec-file main
(gdb) run
Starting program: /home/C++/test_new_server/main
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffb000
GET
 
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff75e9b61 in _IO_str_overflow_internal () from /lib64/libc.so.6
(gdb) bt
#0  0x00007ffff75e9b61 in _IO_str_overflow_internal () from /lib64/libc.so.6
#1  0x00007ffff75e8d04 in _IO_default_xsputn_internal () from /lib64/libc.so.6
#2  0x00007ffff75bea00 in vfprintf () from /lib64/libc.so.6
#3  0x00007ffff75de5b9 in vsprintf () from /lib64/libc.so.6
#4  0x00007ffff75c8b58 in sprintf () from /lib64/libc.so.6
#5  0x0000000000400ed8 in ?? ()
#6  0x00000000006013fb in ?? ()
#7  0x0000000000400cd3 in ?? ()
#8  0x00007ffff7ae1000 in ?? ()
#9  0x0000000000000004 in ?? ()
#10 0x0000000000401241 in ?? ()
#11 0x00000000006021e8 in ?? ()
#12 0x00007fffffffe840 in ?? ()
#13 0x0100000000401056 in ?? ()
#14 0x00007fffffffe978 in ?? ()
#15 0x00000001f7ffdbc0 in ?? ()
#16 0x00000000006021e8 in ?? ()
#17 0x0000000000400a43 in ?? ()
#18 0x0000000000602028 in ?? ()
#19 0x0000000000400fd7 in ?? ()
#20 0x00000000006021e8 in ?? ()
#21 0x0000000000000003 in ?? ()
#22 0x0000000000401250 in ?? ()
#23 0x0000000000000000 in ?? ()
Чего не так? подскажите пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2012, 18:07
Ответы с готовыми решениями:

Создание двунаправленного списка с использованием malloc(), free()
При заполнении списка вылазит ошибка &quot;Вызвано исключение по адресу 0x0FE7373F (vcruntime140d.dll) в файл.exe: 0xC0000005: нарушение прав...

malloc/free
Делаю устройство. Atmega16. Принимает пакеты по RF. Всего полезных данных передается 512 байт. Они влазят в 10 пакетов. Знаю...

Из malloc-free в new delete
Есть код с выделением памяти с помощью malloc, надо сделать с new delete Вроде сделал, освобождение памяти работает, а с выделением...

5
387 / 151 / 16
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 18:15
C++
1
2
ans = (char*)malloc(sizeof(char)+1);
sprintf( ans, httpretval, 200, "OK" );
два байта (sizeof(char) + 1) маловато для такого sprintf
C++
1
2
free(ans);
cout << ans;
ты освобождаешь память, а потом ее используешь, а надо наоборот
0
0 / 0 / 1
Регистрация: 14.06.2012
Сообщений: 16
09.07.2012, 12:32  [ТС]
Наоборот тоже делал, он выводит что нужно и все равно падает с теми же ошибками.

два байта (sizeof(char) + 1) маловато для такого sprintf
сколько нужно? Можете дать рекомендации по приведенному коду!?

Добавлено через 4 часа 1 минуту
И еще вопрос. Почему без malloc sprintf не срабатывает?

Добавлено через 19 часов 31 минуту
Цитата Сообщение от bigstinky Посмотреть сообщение
И еще вопрос. Почему без malloc sprintf не срабатывает?
Это я разобрался. Нужно объявить answer[размер]. А вот вопрос по free остается открытым.

Где и что я делаю не так?
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2012, 12:43
Цитата Сообщение от bigstinky
Где и что я делаю не так?
Везде, начиная от проверки std::string через c_str и strcmp и заканчивая sprintf-ом в двухбайтовую строку и освобождением памяти до вывода.
Цитата Сообщение от bigstinky
сколько нужно?
Столько, чтобы туда влезла модифицированная строка httpretval
Цитата Сообщение от bigstinky Посмотреть сообщение
Нужно объявить answer[размер]
И использовать snprintf

Марш книгу читать
1
0 / 0 / 1
Регистрация: 14.06.2012
Сообщений: 16
09.07.2012, 14:11  [ТС]
И точно! Я просмотрел, что там snprintf используется. Спасибо.

Везде, начиная от проверки std::string через c_str и strcmp и заканчивая sprintf-ом в двухбайтовую строку и освобождением памяти до вывода
про free после вывода я писал, что тоже ошибка вылетает.

sprintf, без выделения памяти, не пашет, потому, что длинная строка слишком?

проверки std::string через c_str и strcmp
а тут почему не так? Он же проверяет строку. Или лучше compare использовать?

Какую книжку читать? Я читал Аки прогать на C++ Х. Дейтел Второе издание

Пыс.Пыс. Пробовал использовать char и работать с данными через strtok(), но он цобака так же вылетает Segmentation fault. Вот я голову и ломаю чего не так.
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2012, 14:17
Цитата Сообщение от bigstinky Посмотреть сообщение
sprintf, без выделения памяти, не пашет, потому, что длинная строка слишком?
Одна слишком длинная, другая слишком короткая, но суть одна.

Цитата Сообщение от bigstinky Посмотреть сообщение
про free после вывода я писал, что тоже ошибка вылетает.
Раз используете С++, то new вместо malloc и delete[] вместо free. Но в любом случае, освобождение памяти должно быть после вывода.

Цитата Сообщение от bigstinky Посмотреть сообщение
а тут почему не так? Он же проверяет строку.
http://en.cppreference.com/w/c... erator_cmp

Цитата Сообщение от bigstinky Посмотреть сообщение
Какуб книжку читать?
Литература C++
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.07.2012, 14:17
Помогаю со студенческими работами здесь

Грабли malloc/free
С динамической памятью впервой работаю, от сюда и грабли Есть структура typedef struct { uint8_t data_size; uint8_t *data;...

Собственная реализация malloc, free
Нужно написать собственную реализацию malloc, free без использования calloc и всего подобного. Где можно об этом почитать или посмотреть...

Освобождение памяти malloc free
В общем работаю над расширением для php (для тренировки в php и в c++ сразу) Суть дела вот в чем, наткнулся на конвертер php массива в...

SIGABRT после free malloc
не могу почистить string array matches (2 dim) проблема возникает на линии 114 отмеченной как //Cleaning up an array не могу почистить...

Malloc + free + chdir = segmentation fault
Приветствую всех! Есть такой код (можете меня ругать я пока учусь): #include &lt;stdbool.h&gt; #include &lt;dirent.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru