gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:37:32 25 4
gpt4 key购买 nike

我有以下问题:

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);
}

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

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

行的转储处理了 2 个这样的调用:

| (null) | (null)  |
-----------------------------------------------------
| (null)| (null) |
| LastContainerUpdatePropagation| 1307967498 |
------------------------ END ------------------------

3次调用后:

| (null) | (null)  |
-----------------------------------------------------
| (null)| (null) |
| (null)| (null) |
| LastSystemUpdatePropagation| 1307967498 |
------------------------ END ------------------------

并且在没有添加新行的情况下完全离开作用域后,每一行都被释放了。

那么,现在我的问题是:std:vector 如何复制对象?我必须做什么才能保留指向字符串的指针或将它们复制到另一个空间?

非常感谢!

最佳答案

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

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

作为一种良好做法,任何具有非平凡析构函数的类都应该具有复制构造函数和复制赋值运算符,正是出于这个原因(这被称为 rule of three )。如果复制构造函数没有意义(例如,对于 ostream 之类的东西),则应将其设为私有(private),以防止意外复制。

关于c++ - std::vector 如何将对象复制到其内部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6349322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com