【发布时间】:2021-10-16 21:19:58
【问题描述】:
我最近在类和指针方面做了很多工作,遇到了以下场景:
我有一个 DataBase 类的对象,它包含一个 std::vector 指向 DataSet 类对象的指针,其中包含一个浮点向量。 现在的问题是: 如果我希望删除所有这些 Datasets 及其存储的浮点数,是否只需删除 DataBase 类的对象就足够了,还是我首先需要删除所有引用的 DataSets 然后删除 DataBase 对象?
两个类的代码:
class Dataset
{
public:
Dataset();
~Dataset();
std::vector<float*>* InputValues = new std::vector<float*>;
std::vector<float*>* ExpectedValues = new std::vector<float*>;
};
class DataBase
{
public:
DataBase();
~DataBase();
int AddedDataSets = 0;
std::vector<Dataset*>* DataSets = new std::vector<Dataset*>;
};
这些 vectos 将被其他函数填充,到最后,我想再次删除它们:
删除“数据库对象的名称”;
【问题讨论】:
-
这取决于
DataBase类的析构函数做了什么。 -
不,这是要避免使用原始指针和
new的原因之一。您甚至不需要这里的动态对象,只需从您的代码中删除所有指针和new,它就会起作用。std::vector<float*>* InputValues应该只是std::vector<float> InputValues;。这段代码看起来像是受到 Java 或 C# 的启发。new在 C++ 中不如在那些语言中有用,C++ 鼓励值语义。在实践中,在现代 C++ 中,几乎没有理由使用new或delete。 -
Unelated:如果你需要一个析构函数,你可能还需要特殊的成员函数来正确处理复制和移动类实例。详情请咨询the Rule of Three/Five/Zero。
-
删除对象就足够了。如果不是,那是因为您设计了错误的对象。它应该自己清理。如果没有,它就坏了。
-
在上述所有用例中,无需使用指针或
new操作。使它们成为普通对象,一切都会按预期工作。