2013-11-23 5 views
0

Visual C++ сообщает о том, что неверный параметр был передан fclose, что параметр будучи FILE* возвращаемый freopen_s:

#include <WinSock2.h> 
#include <iostream> 

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { 
    UNREFERENCED_PARAMETER(hPrevInstance); 
    UNREFERENCED_PARAMETER(nCmdShow); 

#ifdef _DEBUG 
    AllocConsole(); 
#else 
    AttachConsole(ATTACH_PARENT_PROCESS); 
#endif 

    FILE* pCout; 
    freopen_s(&pCout, "conout$", "w", stdout); //returns 0 

    fclose(pCout); 

#ifdef _DEBUG 
    system("pause"); 
#endif 

    FreeConsole(); 

    return 0; 
} 

Если я не пытаться закрыть CONOUT $ в конец программы? Исключено ли исключение, поскольку указатель файла разделяется между процессами для всех консольных выходов?

+0

Нет репродукции с Visual C++ 2013. Просьба предоставить полный реестр, демонстрирующий проблему. Что вызывает вызов «freopen_s»? (Если вы собираетесь вызывать вариант '_s', вам нужно проверить возвращаемый статус.) –

+0

Возврат errno_t равен 0, что означает отсутствие ошибки, не так ли? – NmdMystery

+0

Это происходит только в режиме деблокирования, хотя функция возвращает 0 в обоих случаях. – NmdMystery

ответ

3

Вызов fclose не подходит, потому что вы передаете нуль FILE*. FILE* имеет значение null, поскольку вызов freopen_s не выполняется. Этот вызов завершается с ошибкой, потому что в процессе нет консоли, которую нужно открыть.

Ваша программа работает в отладочных сборках, потому что вы вызываете AllocConsole, чтобы выделить консоль для вашего процесса. Ваша программа не работает в сборках релизов, потому что вы не вызываете AllocConsole; вы вызываете AttachConsole, что приведет к сбою (и не будет никакого эффекта), если родительский процесс не имеет консоли.

+0

+1 для красивого подведения итогов всех комментариев и моего ответа в один сплоченный ответ. Я сделал ошибку, продолжая комментировать ответ. –

+0

Хорошо, кричит. Это должно было быть очевидным с самого начала, но я проверял вывод из командной строки, где AllocConsole и freopen_s не терпят неудачу, и отлаживали от VS без консоли, где AllocConsole и freopen_s терпели неудачу. Отладчик все же сообщил, что возвращаемое значение freopen_s равно 0, хотя, возможно, это было просто неточно. – NmdMystery

Смежные вопросы