[英]Can't push_back a class containing an ofstream pointer to a vector
我在嘗試將包含ofstream的指針的類推送到向量時遇到了奇怪的段錯誤。 我已將問題縮小到最簡單的測試用例:
測試
#ifndef __TEST_
#define __TEST_
#include <fstream>
#include <string>
class Test {
public:
Test(std::string path);
~Test();
private:
ofstream* ofstr;
}
#endif
測試文件
#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時,將發生段錯誤。
您的代碼遭受的第一個問題是您沒有遵循“三法則” 。
但是,您的問題要比遵循“三則法則”所建議的要深。
假設您的班級成員變量與std::ofstream*
。
class Test {
public:
Test(int in) : ptr(new int(in)) {}
~Test();
private:
int* ptr;
}
通過確保在復制構造函數和復制賦值運算符中執行正確的操作,可以更新該類以遵循三個規則。 在這兩種方法中,您都必須使用以下方法:
ptr = new int(*copy.ptr);
適用於大多數類型。 但是,這對於std::ofstream
不起作用,因為std::ofstream
沒有復制構造函數或virtual
函數可以通過克隆對象返回指針。
在您的情況下,以下兩項都不是選項。
ofstr = new ofstream(*copy.ofstr);
ofstr = copy.ofstr->clone();
要解決該問題,可以使用std::shared_ptr<std::ofstream>
。
class Test {
public:
Test(std::string path);
~Test();
private:
std::shared_ptr<std::ofstream> ofstr;
}
當您這樣做時,不僅可以解決問題,還可以讓編譯器生成的析構函數,復制構造函數和復制賦值運算符做正確的事情。 您的類定義可以簡化為:
class Test {
public:
Test(std::string path);
private:
std::shared_ptr<std::ofstream> ofstr;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.