новый / удалить вызывает нарушение прав доступа - PullRequest
0 голосов
/ 02 декабря 2011

Хорошо, это озадачивает меня ... Код ниже находится в DLL, и когда мое консольное приложение вызывает этот код, оно внезапно выдает нарушение прав доступа в строке delete[] lpBuffer.Я использовал этот код весь день и не изменил его вообще.До сих пор это работало просто отлично.

Сообщение о нарушении прав доступа

Необработанное исключение в 0x6948b1a5 в rhcopy.exe: 0xC0000005: Место чтения нарушения доступа 0x4de1c37f.

Код библиотеки

#define MAX_PACKET_SIZE  0x3FFF

DWORD MyClass::GetFile( LPCSTR lpszRemoteFile, LPCSTR lpszLocalFile )
{
    LPBYTE lpBuffer = NULL;

    // ...

    lpBuffer = new BYTE[MAX_PACKET_SIZE];

    // ...

    if( NULL != lpBuffer )
        delete[] lpBuffer;

    // ...
}

Я что-то не так делаю?

С другой стороны: я думал о преобразовании lpBuffer в вектор.Мнения?

изменить

Я хочу поблагодарить вас, ребята, за вашу помощь!Но, видимо ... Проблема не в этом.На самом деле проблема заключается в операторе printf() в вызывающем приложении, который возникает сразу после вызова GetFile(...).Я прошу прощения за путаницу.Казалось бы, инструмент отладки Microsoft указывает не на строку, вызвавшую ошибку, а на последнюю строку, которая была выполнена.Я проголосовал, чтобы закрыть вопрос.

Ответы [ 2 ]

4 голосов
/ 02 декабря 2011

В приведенном здесь коде нет ничего неправильного.

На ум приходят две возможности:

  1. На самом деле ошибка не в deleteно в коде с обеих сторон.

  2. Вы сделали что-то, чтобы повредить кучу, используя недопустимый указатель, который перезаписывает некоторую случайную память, или удаляя указатель более одного раза.

Ни одна из этих проблем не будет обнаружена при переключении на RAII (т. Е. vector) в отображаемом коде, но может улучшить ситуацию, если вы будете последовательно использовать их в остальной части кода.

1 голос
/ 02 декабря 2011

Я не совсем уверен, почему нарушение прав доступа вызвано приведенным кодом.

Поскольку на буфер ссылаются только локально, можете ли вы сделать его переменной в стеке, а не выделять его динамически?

Если это должен быть указатель, возможно, вы могли бы вместо этого использовать Boost Smart Pointer:

#include <boost/scoped_array.hpp>

#define MAX_PACKET_SIZE  0x3FFF

DWORD MyClass::GetFile( LPCSTR lpszRemoteFile, LPCSTR lpszLocalFile )
{

    boost::scoped_array<BYTE> bufferPtr;
    ...
    bufferPtr = boost::scoped_array<BYTE>(new BYTE[MAX_PACKET_SIZE]);
    ...
    //No delete needed

}

Что касается точки вектора, если работать с вектором легко, я бы выбрал его или любой другой контейнер STL, когда это возможно.

...