-1

次のように、コンストラクターで動的に割り当てられるメンバーポインターを含むクラスがあります。

class Record {
public:
    Record(unsigned short numBytes, char* bufRecord);
    ~Record();

    unsigned short size() {return m_numBytes;}
private:
    unsigned short m_numBytes;
    char* m_bufRecord;
};

Record::Record(unsigned short numBytes, char* bufRecord) {
    m_numBytes = numBytes;
    m_bufRecord = new char[numBytes];

    for(unsigned short i=0; i<numBytes; i++)
        m_bufRecord[i] = bufRecord[i];
}

Record::~Record() {
    delete m_bufRecord;
}

基本的に、入力バッファーを動的に割り当てられたメンバーバッファーにコピーします。別のクラスのコンストラクターで、このクラスを次のように使用します。

class File {
public:
    File(const char* fileName);
    ~File();

    unsigned int numRecords() {return m_records.size();}
    Record getRecord(unsigned int numRecord) {return m_gdsRecords[numRecord];}
private:
    std::ifstream           m_file;
    std::vector<Record>     m_records;
};

File::File(const char* fileName) : m_file(fileName, ios::in | ios::binary) {
    while(!m_file.eof()) {
        char bufNumBytes[2];
        char* bufRecord;
        unsigned short numBytes;

        m_file.read(bufNumBytes, 2);
        numBytes = (bufNumBytes[0] << 8) + bufNumBytes[1] - 2;
        bufRecord = new char[numBytes];
        m_file.read(bufRecord, numBytes);

        Record record(numBytes, bufRecord);
        m_records.push_back(record);

        delete bufRecord;
    }
}

ただし、このクラスをインスタンス化すると、次のエラーが表示されます。これは、を二重に解放していることを示しているようですm_bufRecord

*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001cb3280 ***

問題は、要素へのポインターを含むクラスの挿入とvector、同じポインターでデストラクタが 2 回呼び出されることにあると推測していますが、これがどのように発生するかはわかりません。ここで何が間違っていますか?

4

2 に答える 2

1

これは3 つのルールの場合です。クラスがデストラクタでリソースを解放する必要がある場合、通常、コピー コンストラクタ (およびコピー代入演算子) を宣言して、所有するリソースをコピーするか、共有所有権を管理するか、またはコピーされないようにする必要があります。

于 2013-02-10T17:35:36.930 に答える
0
Record getRecord(unsigned int numRecord) {return m_gdsRecords[numRecord];}

この関数は、のコピーを返しますRecord。これRecordで、同じm_bufRecordポインタを含む 2 つの ができました。これらの s でデストラクタを実行Recordすると、同じポインタ値を 2 回削除しようとします。

于 2013-02-10T17:26:29.967 に答える