簡體   English   中英

無法push_back一個包含指向向量的ofstream指針的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM