You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++Builder中使用rdbuf重定向cerr的异常问题排查

C++Builder中cerr重定向的内存访问违规问题

我尝试在程序启动时将cerr重定向到文件,程序结束时恢复其默认输出,该思路参考了Stack Overflow的已采纳方案。但在C++Builder环境中遇到异常情况:

  • 注释第一行的#define MAKE_WORK会触发内存访问违规;
  • 开启该宏后程序运行期间正常,但在更大的程序中,应用终止后仍可能出现相同的内存访问违规问题。

测试代码如下:

//#define MAKE_WORK

#include <vcl.h>
#pragma hdrstop

#include <fstream>
#include "TestRdbuf.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
std::streambuf* origBuff;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    std::ofstream oFile("ErrorLog.txt");
    origBuff = std::cerr.rdbuf();
    std::cerr.rdbuf(oFile.rdbuf());

    std::cerr << "Started: " << Now() << std::endl;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
#ifdef MAKE_WORK
    std::ofstream oFile("ErrorLog.txt", std::ios_base::app);
    std::cerr.rdbuf(oFile.rdbuf());
#endif

    std::cerr << "Closing:" << Now() << std::endl;
    std::cerr.rdbuf(origBuff);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
#ifdef MAKE_WORK
    std::ofstream oFile("ErrorLog.txt", std::ios_base::app);
    std::cerr.rdbuf(oFile.rdbuf());
#endif

    std::cerr << "Debug log time: " << Now() << std::endl;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnShowFileClick(TObject *Sender)
{
    TMemo * Memo = new TMemo(pnlBody);
    Memo->Parent = pnlBody;
    Memo->Align = TAlign::alClient;
    Memo->Font->Size = 12;
    Memo->Lines->LoadFromFile("ErrorLog.txt");
    Memo->ReadOnly = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
#ifdef MAKE_WORK
    std::ofstream oFile("ErrorLog.txt", std::ios_base::app);
    std::cerr.rdbuf(oFile.rdbuf());
#endif

    std::cerr << "Exit clicked: " << Now() << std::endl;

    Application->Terminate();
}
//---------------------------------------------------------------------------

内容的提问来源于stack exchange,提问作者Vic Fanberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:25:35