C ++跟踪记录问题,fstream访问违规问题

时间:2011-04-18 10:19:21

标签: c++ trace access-violation fstream

这真的是两个问题,我将从最简单的开始。我在这个简单的程序结束时遇到访问冲突异常。这是在MSVC6中(是的,我知道......)。

int main()
{
  std::fstream logFile("clog.txt");
  std::clog.rdbuf( logFile.rdbuf() );

  // ... use clog ...

  logFile.close();  // I've tried removing this, same problem.
  return 0;
}

第二个问题是我如何尝试应用std :: clog。我想实现一个相当简单的跟踪功能,它只在调试时才有效。 “释放模式”期间的任何跟踪都会太慢。

我目前的想法基本上是:

#define TRACE_LOG_TOGGLE  1

#if TRACE_LOG_TOGGLE
#define TRACE_LOG(a)  // something that ultimately uses std::clog
#else
#define TRACE_LOG(a)  // empty.
#endif

首先,在MSVC6中是否有人知道是否存在类似_DEBUG_的预处理器常量或与配置是Debug还是Release模式相对应的内容?这将消除程序员手动切换的需要(但这是一个非常小的问题)。

更详细的问题是,是否存在某种模板魔术方式来执行此sans宏。我感觉有点尼安德特人用宏开始每一个功能。

三个要点:

(1)该程序存储在DLL中。如果有两个相同的函数,一个有跟踪,一个没有,完全没问题。事实上,这将是理想的。我不关心二进制文件是否是两倍大小,只要它提高了代码的可维护性。

(2)“释放模式”功能必须有一个NOOP用于跟踪记录。

(3)但是我不希望每个函数都使用trace logging参数作为模板函数。

一如既往,非常感谢你们。

1 个答案:

答案 0 :(得分:1)

对于第一个问题,您可能希望恢复原始缓冲区。类似的东西:

std::fstream logFile("clog.txt");
streambuf * old = std::clog.rdbuf( logFile.rdbuf() );

// ... use clog ...

std::clog.rdbuf( old );
logFile.close();  // I've tried removing this, same problem.

或者更好的是,创建一个RAII类来处理它。

对于跟踪,宏是可行的方法。我会坚持使用你自己的#define,因为你可以选择在非调试版本中使用跟踪。