** Обнаружен glibc *** free (): неверный указатель: 0x0000000000400b2c - PullRequest
1 голос
/ 09 сентября 2011

Рассмотрим следующий код:

int main()
{
    char* s = (char*) malloc(sizeof(char)*10);
    s="hello";
    free(s);
}

При выполнении этой программы я получаю сообщение об ошибке:

** glibc detected *** free(): invalid pointer: 0x0000000000400b2c

Мои исследования этой ошибки показывают, что это может быть вызвано нехваткой памятипробел через malloc().Но программа уже вызывает malloc(), что дает достаточно места для 10 char с.

Ответы [ 5 ]

10 голосов
/ 09 сентября 2011
s="hello";

Вы назначаете другой адрес для s, статически выделенной памяти.Освобождение это не правильно.Кроме того, поскольку вы делаете это, вы, по сути, теряете выделенную здесь память:

char* s = (char*) malloc(sizeof(char)*10);

Попробуйте:

int main()
{
    static const size_t kBufferSize = 10;
    char* s = (char*) malloc(sizeof(char) * kBufferSize);
    strncpy(s,"hello", kBufferSize); // better than strcpy, you are protecting
                            // yourself from a buffer overflow
    free(s);
}
9 голосов
/ 09 сентября 2011

После:

s="hello";

s больше не указывает на память, которую вы динамически распределяли.Он указывает на этот строковый литерал "hello".Вы не можете освободить это, так как это не было malloc в первую очередь.И вы слили это распределение, поскольку у вас больше нет указателя на него.

Посмотрите на функцию strncpy, чтобы скопировать одну строку C в другую.

2 голосов
/ 09 сентября 2011

Вы переназначаете s из указателя malloc на постоянный строковый литерал, который вы затем пытаетесь набрать free.Поскольку строковый литерал не был выделен с malloc, free, что неудивительно, что приводит к плохим вещам.

О, и я вижу, что вы произвели возвращение malloc.Если вы используете C, вы не должны этого делать;если вы используете C ++, то вы должны использовать new / delete вместо malloc / free.

1 голос
/ 09 сентября 2011

Ошибка передавать на free() все, что не приходит от malloc().

Назначение "hello" на s и последующая попытка освободить его нарушает это правило.

0 голосов
/ 09 сентября 2011

ошибка в том, что вы освобождаете память, которой не владеете. вы освобождаете строковый литерал вместо явно созданной памяти, запрошенной через malloc / new & co ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...