GDB выдает ошибку, но программа работает нормально - PullRequest
1 голос
/ 06 февраля 2010

У меня есть простая программа на C, которая имеет указатель на массив символов. Чтобы запустить его, я использую malloc, а затем изменяю его размер, а затем устанавливаю его x раз в программе.

Когда я изменяю его размер один раз с помощью realloc, gdb не показывает никаких ошибок, однако, если я пытаюсь вызвать функцию изменения размера снова, gdb показывает следующую ошибку:

warning: Invalid Address specified to RtlReAllocateHeap( 003E0000, 00404076 )

Любые идеи, почему изменение его размера более одного раза дает эту ошибку?

EDIT

Я поиграл с этим, и, кажется, ошибка не возникает, когда я закомментирую настройку данных указателя, которая происходит после изменения размера.

void setName(struct class_x *class, char *name)
{
    class->name = (char *) reallocateMemory(class->name, sizeof(char) * strlen(name) + 1);
    class->name = name;
}

void *reallocateMemory(void *member, size_t size)
{
    void *tmp = realloc(member, size);
    if(tmp == NULL)
    {
        //handle
    }
    return tmp;
}

Ответы [ 2 ]

3 голосов
/ 06 февраля 2010

class->name = name не делает то, что вы думаете. Используйте strncpy(), чтобы скопировать строку ввода в недавно выделенную память. То назначение, которое у вас есть, - это утечка выделенной памяти и перезапись указателя. Затем, когда вы в следующий раз позвоните setName(), вы в итоге вызовете realloc() с указателем, который вы не получили от malloc(). Я ожидаю, что где-то вы вызываете setName() с константой, глобальной переменной или строкой локальной переменной, и именно это в конечном итоге приводит к ошибке. Если бы вы когда-либо вызывали setName() только со строками, чья память у вас была malloc(), вы бы не увидели предупреждение от gdb (но у вас все равно будет ошибка!).

0 голосов
/ 06 февраля 2010

запустите его под валгриндом или электрическим забором - это определит переполнение памяти для вас

...