尝试将 std::cerr 重定向到文件时出现访问冲突异常
Access violation exception while trying to redirect std::cerr to file
我想将std::cerr
和std::cout
的输出重定向到文件。为此,我使用了下面的代码示例中的rdbuf
函数。不幸的是,我收到异常
Exception thrown: read access violation.
*(__imp_std::basic_ios<char,std::char_traits<char> >::rdbuf(...)) was 0xCCCCCCCC.
每当我尝试写任何东西std::cout
或std::cerr
.
下面是产生我问题的代码示例:
void redirect()
{
auto t = std::time(nullptr);
auto tm = *std::localtime(&t);
std::ostringstream oss;
oss << std::put_time(&tm, "%Y-%m-%d_%H-%M-%S.log");
auto cerrFileName = "cerr-" + oss.str();
auto coutFileName = "cout-" + oss.str();
std::ofstream cerrFile(cerrFileName, std::ios::ate); // file is created
std::cerr.rdbuf(cerrFile.rdbuf());
std::ofstream coutFile(coutFileName, std::ios::ate); // file is created
std::cout.rdbuf(coutFile.rdbuf());
}
int main()
{
redirect();
std::cout << "Test"; // The exception is thrown here.
return 0;
}
此示例按原样创建两个文件,但不会将任何内容写入这两个文件。我做错了什么?
std::ofstream
拥有其缓冲区,当std::ofstream
对象超出范围时,它们会破坏缓冲区,从而导致使用指向缓冲区的无效指针std::cout
和std::cerr
。
确保缓冲区不会过早删除。
例如
std::cout.rdbuf(coutFile.rdbuf());
你使std::cout
与coutFile
共享相同的缓冲区,你只设置指针。
不幸的是,std::basic_streambuf
不计算参考。这意味着当redirect
函数返回时,coutFile
被破坏并关闭,其中包括破坏缓冲区对象。
那留下例如std::cout
带有指向不存在的缓冲区对象的杂散指针。
与您共享缓冲区对象的流需要在整个程序中具有生存期。在退出程序之前,您需要恢复std::cout
和std::cerr
的原始缓冲区(rdbuf
返回指向旧缓冲区的指针(。
相关文章:
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 在C++中删除双向链表的头节点后出现访问冲突异常
- C++ 引发异常:访问冲突写入
- 未处理的异常..访问冲突写入位置
- 存储类对象的C++模板链表-未处理的异常访问冲突读取位置
- 读取位置/使用结构的矢量时发生未处理的异常访问冲突
- 未处理的异常:访问冲突读取位置
- 未捕获异常.访问冲突读取位置
- 未处理的异常 - 访问冲突读取位置0x00000000
- 使用函数指针C++异常:访问冲突执行位置0x00000000
- 赋值变量时c++未处理异常访问冲突
- 在c++中使用JNI时,c0000005异常(访问冲突)
- c++ std::cin未处理异常:访问冲突写入位置
- 使用 int 变量的 C++ 异常访问冲突
- 未处理的异常/访问冲突,只要我在变量上使用 OutputDebugStringW()
- 异常:访问冲突