c++在赋值后正确使用delete

c++ correct use of delete after an assignment

本文关键字:delete 赋值 c++      更新时间:2023-10-16

我对如何正确使用delete关键字有点困惑。这是我的场景:

class Tuple {
public:
    Tuple(int columns);
    ~Tuple();
    void set(int i, string d);
    string get(int i);
    int columnCount();
private:
    string *data;
    int columns;
};

Tuple::Tuple(int columns) {
    this->columns = columns > 0 ? columns : 0;
    if (this->columns  > 0) {
        data = new string[this->columns];
    } else {
        data = 0;
    }
}
Tuple::~Tuple() {
    if (columns > 0) {
        delete[] data; 
    }
}
void Tuple::set(int i, string d) {
    if (columns > 0 && i > -1 && i < columns) {
        data[i] = d;
    }
}
class Table {
public:
    Table(int columns);
    ~Table();
    void insertTuple(Tuple t);
    Tuple getTuple(int i);
    int columnCount();
    int rowCount();
private:
    vector <Tuple> data;
    int columns;
    int rows;
};

现在,当我调用以下代码时,我会得到一个segfault:

        Tuple *outTuple;
        outTuple = new Tuple(cCount);
        for (int i=0; i<cCount; i++) {
            tmpStr = string(reinterpret_cast<const char*>(sqlite3_column_text(statement, i)));
            outTuple->set(i, tmpStr);
        }
        (*outTable)->insertTuple(*outTuple);
        delete outTuple; //here I get segfault

我的代码出了什么问题?我的代码写得不好吗?我可以改进它并避免segfault吗?

最可能的原因是Tuple违反了三规则。具体来说,您需要定义一个复制构造函数和一个复制赋值运算符。否则,您可能会双重删除data

您没有显示构造函数和析构函数,但Tuple使用的内存管理实践看起来很脆弱。为什么不使用std::vector而不是指针呢?

动态内存分配的带有指针的变量,通常有一个"容器"或"所有者"。

在这种情况下,函数是主要的"容器"。

"Containment"或"Ownership"可以是从函数到其他变量的转移,在这种情况下,可能是"outTable"。

"outTable"是否从内存中删除元组?

您是否打算让"outTable"成为元组的容器,并让它从内存中删除元组,而不是函数?

或者,您是否希望"outTable"只引用元组,并让函数从内存中删除元组。

干杯。