Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: glibc detected double free or corruption  (Прочитано 4566 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Drak0n4ik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
glibc detected double free or corruption
« : 15 Апреля 2010, 01:44:16 »
Пример кода:
#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
    int size;
    cout << "Enter size of square matrix: "; cin >> size;
    int **matrix;
    matrix = (int**) malloc(size*sizeof(int));
    for(int i = 0; i < size; i++) *(matrix+i) = (int*) malloc(size*sizeof(int));

    for(int i = 0; i < size; i++) { free(*(matrix+i)); }
    free(matrix);
}

После запуска вылетает ошибка:
*** glibc detected *** ./lvl22: double free or corruption (out): 0x0000000000e17030 ***
======= Backtrace: =========
/lib/libc.so.6(+0x775b6)[0x7fb94c0015b6]
/lib/libc.so.6(cfree+0x73)[0x7fb94c007e53]
./lvl22[0x400981]
/lib/libc.so.6(__libc_start_main+0xfd)[0x7fb94bfa8c4d]
./lvl22[0x400829]

Что я делаю не так?

P.S.: если перед запуском программы ввести export MALLOC_CHECK_=0, появляется ошибка Segmentation fault (core dumped).

Система: Ubuntu 10.04

g++ -v
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 15 Апреля 2010, 01:46:55 от Drak0n4ik »

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: glibc detected double free or corruption
« Ответ #1 : 15 Апреля 2010, 01:57:10 »
Я чего-то не понимаю. Вы пишите на C++, но подключаете стандартную библиотеку языка C, так еще и у вас вперемешку С и С++, надо бы определиться.
Если хотите создать указатель и выделить память, то это делается так int x = new int;

Оффлайн Drak0n4ik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: glibc detected double free or corruption
« Ответ #2 : 15 Апреля 2010, 02:06:39 »
Надо выделить памяти под двумерный массив, как сделать?
Это я пытался сотворить, но получилась Жо с ручкой.
Так же: ничего почти не знаю, только учусь. В чем принципиальная разница между С и С++?
« Последнее редактирование: 15 Апреля 2010, 02:09:59 от Drak0n4ik »

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Re: glibc detected double free or corruption
« Ответ #3 : 15 Апреля 2010, 02:16:27 »
Как-то так.
int** Array;
Array = new int* [m];
for (int i = 0;  i < m; i++)
Array[i] = new int [n];
m,n - размер матрицы.

Советую взять хороший учебник и почитать,  станет намного понятнее.
« Последнее редактирование: 15 Апреля 2010, 02:20:52 от hippi90 »

Оффлайн Drak0n4ik

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: glibc detected double free or corruption
« Ответ #4 : 15 Апреля 2010, 08:07:48 »
С new заработало, благодарствую. Но что неправильного было в malloc()?

Какой есть хороший учебник?

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: glibc detected double free or corruption
« Ответ #5 : 15 Апреля 2010, 09:23:27 »
А у меня все заработало.

$ g++ malloc.cpp -o malloc
$ ./malloc
Enter size of square matrix: 12
$
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: glibc detected double free or corruption
« Ответ #6 : 15 Апреля 2010, 12:06:52 »
Главное проклятие для новичков при переходе с 32 бит на 64 - (sizeof(int)!=sizeof(int*))
Пример кода:
    matrix = (int**) malloc(size*sizeof(int*));
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

 

Страница сгенерирована за 0.054 секунд. Запросов: 25.