任何你用动态构造的东西都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;
};