【发布时间】:2022-11-20 21:29:48
【问题描述】:
我直接回答大家的问题:
class Abonne{
private:
int num;
string nom;
int abonnement;
string titre;
public:
/** Methods **/
};
我在另一个类中创建了一个 Abonne 向量:
class Biblio{
private:
vector<Ouvrage*> O;
vector<Abonne> A;
public:
~Biblio();
/** Methods **/
};
所以这是我这个类'Biblio'的析构函数的开发:
Biblio::~Biblio()
{
vector<Ouvrage*>::const_iterator it1;
for(it1=O.begin(); it1!=O.end(); it1++){
delete(*it1);
}
vector<Abonne>::const_iterator it2;
for(it2=A.begin(); it2!=A.end(); it2++){
delete(it2);
}
}
所以我的问题是,我收到一个错误消息:delete(it2); 为什么会这样?我不必为没有指针的向量创建析构函数吗?
我只是 c++ 中这种多态性的新手。所以我学会了如何创建一个充满指针的向量的析构函数。我在一个简单的向量上使用了同样的东西,但我有一个错误。我猜函数 delete();不适用于非指针?
【问题讨论】:
-
您在显示代码的任何地方都没有使用
new,那么为什么要使用delete?提供minimal reproducible example。 -
另外,开始使用smart pointers。
-
你需要
delete你new什么,别无其他。 -
是的,
delete仅适用于指向使用new分配的对象的指针。一般经验法则:如果可能,不要使用new和delete:如您所知,如果您别使用new,然后一个不再在范围内的对象被释放(你不能忘记自己做)。您的用例似乎是您可以使用智能指针安全实现的一个很好的例子。 -
如果这个
vector<Ouvrage*> O;拥有它的内容;然后将其替换为:(a)vector<Ouvrage> O;如果没有多态性或 (b)vector< std::unique_ptr<Ouvrage> > O;如果有多态性。