c++ - 在构造函数中移动/交换中间向量后,我应该如何管理它?
问题描述
我正在学习内存管理,但不太确定如何管理删除和/或析构函数策略。
假设我有以下模板:
template <typename X>
class DBContainer {
private:
vector<vector<X>> db;
size_t dbSize;
public:
DBContainer(size_t n = 100) {
dbSize = n;
<vector<vector<X>> *tmp = new vector<vector<X>>(dbSize);
db = std::move(*tmp);
// db = std::swap(tmp);
delete tmp;
}
~DBContainer() { /* how should I delete `db`? */ }
// ~DBContainer() = default;
};
我应该如何设置析构函数策略db
?我知道对于原始指针,std::move
仅将向量的中间向量复制到db
; 因此,我仍然需要删除中介动态分配的向量。我可能是错的,但我相信对于std::swap
.
但是,在程序结束时,我应该如何管理析构函数策略db
?我只是将其设置为默认值吗?
解决方案
任何你用动态构造的东西都new
需要delete
在你用完后被'd'。 当它本身被破坏时,std::unique_ptr
可以通过调用你来帮助解决这个问题,例如:delete
template <typename X>
class DBContainer {
private:
vector<vector<X>> db;
size_t dbSize;
public:
DBContainer(size_t n = 100) {
dbSize = n;
std::unique_ptr<vector<vector<X>>> tmp(new vector<vector<X>>(dbSize));
// or: auto tmp = std::make_shared<vector<vector<X>>>(dbSize);
db = std::move(*tmp);
} // <-- tmp is destroyed here, delete'ing the temp vector
//~DBContainer() = default;
};
的内容tmp
被移到没关系,db
它tmp
本身仍然需要被delete
'd。
但是,由于db
不是通过 动态构造的new
,因此不需要delete
它。DBContainer
当其拥有的对象被破坏时,它将自动被破坏。vector
只有您正在构建的临时文件new
需要delete
'd。但即便如此,也可以通过根本不vector
动态构造临时来避免,例如:
template <typename X>
class DBContainer {
private:
vector<vector<X>> db;
size_t dbSize;
public:
DBContainer(size_t n = 100) {
dbSize = n;
vector<vector<X>> tmp(dbSize);
db = std::move(tmp);
} // <-- tmp is destroyed here
//~DBContainer() = default;
};
或者:
template <typename X>
class DBContainer {
private:
vector<vector<X>> db;
size_t dbSize;
public:
DBContainer(size_t n = 100) {
dbSize = n;
db = vector<vector<X>>(dbSize); // <-- temp destroyed after operator= exits
}
//~DBContainer() = default;
};
话虽这么说,你实际上根本不需要临时vector
的。您可以(并且应该)db
在构造函数的成员初始化列表中直接初始化,例如:
template <typename X>
class DBContainer {
private:
vector<vector<X>> db;
size_t dbSize;
public:
DBContainer(size_t n = 100) : db(n), dbSize(n) { }
//~DBContainer() = default;
};
从技术上讲,您也可以摆脱dbSize
,只需db.size()
在需要时使用:
class DBContainer {
private:
vector<vector<X>> db;
public:
DBContainer(size_t n = 100) : db(n) { }
//~DBContainer() = default;
};
推荐阅读
- python - pytest --cov 告诉我我没有导入我拥有的东西
- reactjs - 数组不重新渲染的 useState
- detection - ESP32 Google Vision 人脸检测请求失败
- python - AttributeError: 'str' object has no attribute 'problem' -- 不知道为什么
- c++ - 如何使 2 个基类使用其基类的相同属性?
- javascript - 下拉选择jQuery
- assembly - MIPS 汇编中跳转指令中的 4 个最高有效位
- firebase - 有没有办法用 2 where 进行查询,一个用于集合,另一个用于子集合。?
- r - 识别只有 0 个值的列
- python - 正则表达式 - 仅包含最大长度的匹配项