Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
bigstinky
0 / 0 / 1
Регистрация: 14.06.2012
Сообщений: 16
1

malloc, free error

07.07.2012, 18:07. Просмотров 1371. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2012, 18:07
Ответы с готовыми решениями:

malloc
Народ, кто-нить может объяснить какие есть недостатки у этой функции, всегда юзал, а тут говорят,...

Аналог malloc
Необходимо релизовать свой malloc.Интересует меня следующее: как malloc опирирует памятью? Я...

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

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

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

5
yekka
386 / 150 / 16
Регистрация: 12.05.2011
Сообщений: 450
07.07.2012, 18:15 2
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
bigstinky
0 / 0 / 1
Регистрация: 14.06.2012
Сообщений: 16
09.07.2012, 12:32  [ТС] 3
Наоборот тоже делал, он выводит что нужно и все равно падает с теми же ошибками.

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

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от bigstinky Посмотреть сообщение
Какуб книжку читать?
Литература C++
0
09.07.2012, 14:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2012, 14:17

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru