【发布时间】:2018-07-27 21:08:32
【问题描述】:
我在尝试将包含 ofstream 指针的类推送到向量时遇到了一个奇怪的段错误。我已将问题缩小到可能的最简单的测试用例:
Test.h
#ifndef __TEST_
#define __TEST_
#include <fstream>
#include <string>
class Test {
public:
Test(std::string path);
~Test();
private:
ofstream* ofstr;
}
#endif
Test.cpp
#include "Test.h"
Test::Test(std::string path) {
ofstr = new ofstream(path, std::ios::app);
}
Test::~Test() {
delete ofstr;
}
main.cpp
#include <vector>
#include "Test.h"
int main() {
Test test("hello.txt");
std::vector<Test> vec;
vec.push_back(test); // segfaults
}
我认为段错误与 Test 的析构函数有关,但我不确定为什么。当我使用 emplace_back 时也会发生段错误。
【问题讨论】:
-
@πάνταῥεῖ 我正在更改欺骗目标,因为它是违反三规则的规则,因为 OP 有一个指向流的指针
-
由于违反了三规则,您的指针被双重删除。那是未定义的行为。
-
您的代码段错误,因为 main 中的变量
test和向量元素都有一个指向同一元素的指针,并且当它们被破坏时,您正在破坏 ofstream 元素两次。如果您希望Test类的多个对象共享指向 ofstream 的指针,则应使用std::shared_pointer<std::ofstream>,您可以在此处阅读更多信息en.cppreference.com/w/cpp/memory/shared_ptr -
完全不相关的旁注:任何地方的前导下划线和双下划线都有特殊含义。 What are the rules about using an underscore in a C++ identifier? 中有关此内容的更多信息很少会违反此规则,但一旦发生,结果可能会令人费解。