c++ - 取消对 unique_ptr 的引用

标签 c++ c++11 segmentation-fault unique-ptr dereference

以下(不安全的)代码有效

#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::ofstreamstd::cout,所以我想我真的需要返回一个指向 base 的指针类 std::ostream。我该怎么办?

最佳答案

你的假设是正确的。 create_safe_stream 返回一个 std::unique_ptr ,它立即超出范围,因此它持有的原始资源被 deleted 并尝试使用它是 UB .

不使用中间变量并在一行中完成所有操作的方法是只返回一个 std::ofstream 对象:

std::ofstream create_safe_stream(const char* filename) {
    return std::ofstream {filename};
}

int main() {
  std::ostream s_out = create_safe_stream("foo.txt");
  s_out << "foo\n" << std::endl; 
  return 0;
}

关于c++ - 取消对 unique_ptr 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56603743/

相关文章:

c++ - 将字符串写入文件末尾(C++)

c++ - 在 C++ 中强制删除 std::shared_ptr

c++ - 通过浮点指针操作字节 vector

c++ - add_lvalue_reference实现示例

c - strcat 上的段错误

c - 二维数组的段错误

c - pthread_join 导致段错误。为什么?

C++:空数组的第一个索引不会用 .resize() 填充其给定字符,但后面的每个其他字符都会

c++ - 在哪些情况下,编译器可以根据自己的意愿重新排序指令

c++ - X 因应用程序而挂起(使用 C++、Qt、OpenGL)