Сообщение о нарушении прав доступа при удалении динамически создаваемого двумерного массива - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь выделить двумерный массив динамически, а затем после использования удалить его. Код выглядит примерно так:

func(char* pszError)
{

    //Initialize

    char ** ptr = new char*[1];

    // Some copying stuff in ptr[0]
    ptr[0] = new char[strlen(psError) + 1];
    strcpy(ptr[0], strlen(pszError) + 1, pszError); 

    delete[] ptr[0];

    delete[] ptr;

    return;

}

Это выглядело безвредным для меня и не должно было дать ошибки. Тем не менее, в точке delete[] ptr; это вызывает у меня нарушение прав доступа.

Может кто-нибудь помочь мне. Я сделал достаточно удара головой об этом.

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Ошибка заключается в следующих строках:

ptr[0] = new char[strlen(psError) + 1];
strcpy(ptr[0], strlen(pszError) + 1, pszError);

Все остальное мне кажется правильным. Но код не должен даже компилироваться с этими ошибками. Некоторые моменты для рассмотрения:

  • strcpy не принимает 3 параметра. Этот код не должен даже компилироваться. Это может означать одно из следующего:
    • У вас есть опечатка, и вы хотели использовать strncpy. Если это так, то ваши 2-й и 3-й параметры обратные, что может привести к нарушению доступа.
    • Вы перегрузили функцию strcpy своей собственной функцией, которая принимает 3 параметра. Пожалуйста, отправьте код для этого, если это так. Возможно, вам лучше использовать strncpy.
  • "strlen (psError)" также не должен компилироваться (пропуская "z"). Я предполагаю, что вы имели в виду pszError, но если у вас есть глобальная переменная с именем psError, то, вероятно, выделяется неправильный объем памяти.
  • Если pszError является неверным указателем или, вероятно, не завершен нулем, то код, очевидно, завершится сбоем.

См. http://linux.die.net/man/3/strcpy для правильных параметров strcpy и strncpy.

0 голосов
/ 01 августа 2011

спасибо за помощь! Мы обнаружили, что проблема была указана некоторыми из вас при распределении ресурсов. Итак, мы должны были проверить после выделения, был ли возвращенный указатель верным. Он никогда не компилируется, пока мы копируем / etc. Однако, когда распределитель попытался освободить память, это дало нарушение прав доступа.

С уважением,

Andy

...