我正在编写一个输出为stdout或文件的代码。为此,我发现使用@objc func handleTapFrom(recognizer : UITapGestureRecognizer)
{
// Some code...
}
很方便。好像我没有适当地使用它。这是一个最小的例子:
ostream
代码编译得很好,但我在运行时遇到了分段错误。 Valgrind说#include <fstream>
struct A {
std::ostream *os;
A (const char *fn) {
std::filebuf fb;
fb.open (fn, std::ios::out);
os = new std::ostream(&fb);
}
std::ostream &getOS () {
return *os;
}
};
int main(int argc, char **argv) {
A a("foo.txt");
a.getOS() << "bar" << std::endl;
return 0;
}
,但我无法正确解读。同样,gdb给出了违规行(调用Use of uninitialised value of size 8
),但我不知道如何纠正它。
答案 0 :(得分:4)
正如@Jodocus评论的那样,变量 std :: filebuf fb 在构造函数中是本地的。当它超出范围时它将被销毁。通过将 std :: filebuf fb 定义为成员变量,可以解决该问题。
#include <fstream>
struct A
{
std::ostream *os;
std::filebuf fb;
A (const char *fn)
{
fb.open (fn, std::ios::out);
os = new std::ostream(&fb);
}
std::ostream &getOS ()
{
return *os;
}
};
int main(int argc, char **argv)
{
A a("/home/test.txt");
a.getOS() << "bar" << std::endl;
return 0;
}