std :: vector如何将对象复制到其内部存储

Den*_*Loh 2 c++ free pointers stdvector

我有以下问题:

void add(){
  cRow Row();
  Row.add("Column", "Value");
  std::vector<cRow> mRows;
  mRows.push_back(Row);
}

cRow::cRow(): mCol(NULL), mVal(NULL) {
}

cRow::add(const char* Col, const char* Val){
  mCol = strdup(Col);
  mVal = strdup(Val);
}

cRow::~cRow(){
  free(mCol);
  free(mVal);
}
Run Code Online (Sandbox Code Playgroud)

将局部变量Row添加到向量后,将为该行调用析构函数并释放字符串.

显然,现在也释放了向量中存储行的字符串的指针.离开本地范围后对行的任何访问都将导致段错误.

行的转储看起来像这样的2个调用:

| (null) | (null)  |
-----------------------------------------------------
| (null)| (null) |
| LastContainerUpdatePropagation| 1307967498 |
------------------------ END ------------------------
Run Code Online (Sandbox Code Playgroud)

3次通话后:

| (null) | (null)  |
-----------------------------------------------------
| (null)| (null) |
| (null)| (null) |
| LastSystemUpdatePropagation| 1307967498 |
------------------------ END ------------------------
Run Code Online (Sandbox Code Playgroud)

并且在完全离开范围而不添加新行之后,每一行都被释放.

那么,现在我的问题是:std:vector如何复制对象?我需要做些什么来保持指向字符串的指针或将它们复制到另一个空间?

非常感谢你!

bdo*_*lan 9

std::vector使用复制构造函数来复制对象.由于您尚未定义复制构造函数,因此它将使用隐式C++复制构造函数,它只是递归复制所有成员; 这还不够,因为您手动管理内存.

您需要定义自己的复制构造函数,或使用类似std::string的东西,如果复制,它将做正确的事情.

作为一个良好的实践,任何具有非平凡析构函数的类都应该有一个复制构造函数和复制赋值运算符,正是出于这个原因(这被称为三个规则).如果复制构造函数没有意义(例如,对于类似的东西ostream),则应将其设置为私有,以防止意外复制.