例如:
class Airport : public vector<Airline*>
如何正确释放内存?我宁愿不使用智能指针,因为我还没有在我的课程中学到它。
答案 0 :(得分:4)
正如其他人所指出的那样,Airport
不应该继承vector
。 Airport
应包含vector
。那么有谁拥有航空公司的问题,你想要在Airport
被摧毁时销毁航空公司吗?如果是这样,我建议使用简单的std::vector<Airline>
:
class Airport {
std::vector<Airline> airlines_;
//...
};
或者,如果您需要多态性,即Airline
是一个基础类,具有针对不同航空公司的专业化,我建议使用智能指针:
class Airport {
std::vector<std::unique_ptr<Airline)> airlines_;
//...
};
如果你真的不想使用智能指针,你可以使用原始指针然后小心在析构函数中删除它们:
class Airport {
std::vector<Airline*> airlines_;
public:
Airport(const Airport&) = delete; // not allowed
Airport& operator=(const Airport&); = delete; // not allowed
~Airport() {
for (auto airline : airlines) {
delete airline;
}
}
//...
};
如果这样做,您需要仔细考虑您希望Airport
具有哪些复制行为,因为默认的复制构造函数和赋值运算符将无法正确管理内存。作为第一步,您可以通过“删除”复制构造函数和赋值运算符来防止复制,如上所述。但我建议你一了解智能指针就会使用它们,因为大多数问题都会消失。
如果机场不拥有航空公司,则在向量中存储原始指针或共享智能指针,并将其留给拥有航空公司的任何人以正确释放内存。在我看来,Airline
可以在多个Airport
中运行,因此Airport
拥有Airline
是没有意义的,所以应该有一个单独的Airline
容器{{1}},但这取决于您的型号。
答案 1 :(得分:0)
class Airport : public vector<Airline*>
一个向量没有虚拟析构函数,因此继承它会导致你进入UB行为。
请改为尝试:
class Airport
{
std::vector<std::unique_ptr<Airline>> airlines_; // notice std::unique_ptr
// ...
};
通过存储std :: unique_ptr而不是原始指针,您不必显式删除任何内容。如果(由于某种原因)你需要存储原始指针,删除指针应该像这样:
Airport::~Airport() { // declare it in the class
std::for_each(airlines_.begin(), airlines_.end(),
std::default_delete<Airline>{});
}
答案 2 :(得分:0)
首先:由于技术原因,从std::vector
继承是错误的
(它没有虚拟析构函数)。在你的情况下,似乎也是如此
由于域名原因错误:机场不是序列
航空公司。想象一下有人向你解释AirportS
现实世界使用这些词。你肯定会争论这一点。
你有两种方法。
使用值(std::vector<Airline>
)来规避此问题。您
如果你这样做,也应该定义一个适当的等于运算符operator==(const
Airline&, const Airline&)
。
或
如果AirportS
真的应该存储指向AirlineS
的指针,那么你
需要了解所有权。 Airport
是否真的拥有
AirlineS
存储在其中?如果是这样,它应该在结束时删除它们
它的生命周期。如果没有,他们应该活着。在第一种情况下,有人
否则需要注意存储和销毁AirlineS
。
如果Airport
拥有并销毁AirlineS
,您需要确认
在你的实施中遵守三法则。