【发布时间】:2019-12-17 15:30:31
【问题描述】:
我正在运行一些 C++ 代码,并注意到一些奇怪的行为。例如,我的 std::cout 打印只打印出我告诉它打印的字符串的一部分。
这是我的一小部分代码(此代码被重复调用):
std::ofstream file;
file.open("cout_img.txt", std::ofstream::out | std::ofstream::app);
std::streambuf* sbuf = std::cout.rdbuf();
std::cout.rdbuf(file.rdbuf());
std::cout << "Reached Display Function NOW";
std::string frame_file_name = std::string("demo") + std::to_string(saveImgNum) + std::string(".bmp");
std::cout << frame_file_name + '\n';
例如,在本节中,我每次只打印“splay Function NOW”,而不是完整的字符串“Reached Display Function NOW”。我什至没有打印出 frame_file_name 变量。
这是否意味着我在某处遇到了内存泄漏?如果是这样,我发布的代码部分看起来是否可疑?是不是因为我必须释放变量,比如 std::string 变量?
我还能寻找什么?我正在使用 CPython API(嵌入在 C++ 中的 Python),如果这有影响的话。
非常感谢!
【问题讨论】:
-
打印文件的方式是使用
cout << file.rdbuf(),而不是将cout的缓冲区设置为文件的缓冲区。改变它,看看你是否得到了你所期望的。 -
“这是否意味着我在某处遇到了内存泄漏?” - 不太可能。内存泄漏的症状是程序内存使用量在没有明显原因的情况下增长,最终程序耗尽了可用内存。并不是说它随机行为不正确。
-
那为什么不使用ofstream本身呢?喜欢
file << "your content";。我仍然无法理解您为什么要设置缓冲区。你可以通过重定向直接在命令行上控制它,通过重定向说&1>cout_txt,而不是在你的程序中硬编码。 -
两个流试图共享同一个读取缓冲区是灾难的根源。
-
@cmed123 你认为这是做什么的:
std::cout.rdbuf(file.rdbuf());?