我有一个指向对象的向量。如何释放记忆?

时间:2014-03-28 08:51:27

标签: c++

例如:

class Airport : public vector<Airline*>

如何正确释放内存?我宁愿不使用智能指针,因为我还没有在我的课程中学到它。

3 个答案:

答案 0 :(得分:4)

正如其他人所指出的那样,Airport不应该继承vectorAirport应包含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,您需要确认 在你的实施中遵守三法则。