Сбой программы при сборке релиза - PullRequest
1 голос
/ 27 апреля 2011

в отладке работает нормально, но когда я запускаю программу C ++ 2010 в сборке релиза (не запущенную из отладчика visual studio), она вылетает.Если я прокомментирую строки после второго преобразования char * -wchar *, это сработает.Почему?

void myfunction(const char *dataBuffer)
{
    size_t buffer_size;

    mbstowcs_s(&buffer_size, NULL, 0, dataBuffer, _TRUNCATE);

    wchar_t *buffer = new wchar_t[buffer_size + 1];

    mbstowcs_s(&buffer_size, buffer, buffer_size, dataBuffer, _TRUNCATE);

    std::wstring archive_data(buffer);
    std::wstringstream archive_stream(archive_data);
    boost::archive::text_wiarchive archive(archive_stream);

    ...

    delete [] buffer;
    buffer = NULL;
}

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

Возможно, из-за неинициализированной переменной (в режиме отладки большинство переменных инициализируются нулем, но не инициализируются в выпуске)

Большинство таких ошибок можно исправить, исправив все предупреждения, сгенерированные компилятором (предупреждения - это действительно логические ошибки, а не синтаксические ошибки). Так что установите уровень предупреждения выше, перекомпилируйте и убедитесь, что вы получаете ноль отклонений.

В dev studio установите уровень предупреждения на четыре, а также установите флаг для обработки предупреждений как ошибок.

Ps. Вместо динамического выделения буфера с помощью

wchar_t*  buffer = new char_t [<size>];

Использовать стандартный вектор (это исключение безопасно)

std::vector<wchar_t> buffer(<size>);

Вы можете получить указатель на буфер с помощью:

&buffer[0]

Также: у Джен (который удалил свой ответ) есть хорошее замечание) Я удалю это и проголосую Джен, если он удалит свой ответ.

Но вы можете проверить, что строка имеет правильное значение NULL, оканчивающееся L '\ 0'.

0 голосов
/ 23 апреля 2016

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

Чтобы уведомить компилятор, чтобы избежать оптимизации для конкретной переменной, объявите как переменная переменная.

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