c++在赋值后正确使用delete
c++ correct use of delete after an assignment
我对如何正确使用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"只引用元组,并让函数从内存中删除元组。
干杯。
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- c++在赋值后正确使用delete
- 将指针赋值给指针(以及将指针传递给类)时使用delete的混淆
- 赋值运算符中的 free() / delete / delete[] / realloc() 错误无效
- 如何使用自定义delete给unique_ptr赋值