【发布时间】:2019-10-29 10:04:57
【问题描述】:
以下(不安全的)代码有效
#include <iostream>
#include <fstream>
std::ofstream* create_unsafe_stream(const char* filename) {
return new std::ofstream {filename};
}
int main () {
std::ofstream& u_out = *create_unsafe_stream("foo.txt");
u_out << "foo\n" ;
delete &u_out;
return 0;
}
我试图制作一个更安全的版本
#include <iostream>
#include <fstream>
#include <memory>
using stream_ptr = std::unique_ptr<std::ostream>;
stream_ptr create_safe_stream(const char* filename) {
return stream_ptr{ new std::ofstream {filename}};
}
int main() {
std::ostream& s_out = *create_safe_stream("foo.txt");
s_out << "foo\n" << std::endl;
return 0
}
哪个编译但是,当我运行它时给我一个分段错误。我在想问题是由unique_ptr 超出范围引起的。所以我尝试将main 修改为
int main() {
stream_ptr ofile = create_safe_stream("foo.txt");
std::ostream& s_out = *ofile;
s_out << "foo\n";
}
再次起作用。
问题
有没有办法不使用像ofile 这样的“中间”变量并在一行中执行所有操作?
编辑
函数create_safe_stream是what I want的玩具模型,也就是说这个函数可能返回std::ofstream到那个文件或者std::cout,所以我想我真的需要返回一个指向基址的指针类std::ostream。我该怎么办?
【问题讨论】:
-
(编辑后):
ofile不是中间的,它是对象的 OWNER。而s_out是所包含对象的辅助别名。
标签: c++ c++11 segmentation-fault unique-ptr dereference