繁体   English   中英

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

[英]I have a vector of pointers to objects. How to free memory?

例如:

class Airport : public vector<Airline*>

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

正如其他人所指出的那样, 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集装箱,但这取决于你的型号。

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>{});
}

首先:从std::vector继承是出于技术原因(它没有虚拟析构函数)是错误的。 在您的情况下,由于域名原因,它似乎也是错误的:机场不是航空公司的序列。 想象一下,有人在现实世界中使用这些词语向您解释AirportS 你肯定会争论这一点。

你有两种方法。

使用值( std::vector<Airline> )来规避此问题。 如果执行此操作,还应定义适当的等于运算operator==(const Airline&, const Airline&)运算operator==(const Airline&, const Airline&)

要么

如果AirportS确实应该存储指向AirlineS指针,那么您需要了解所有权。 Airport真的拥有存储在其中的AirlineS吗? 如果是这样,它应该在其生命周期结束时删除它们。 如果没有,他们应该活着。 在第一种情况下,其他人需要照顾存储和销毁AirlineS

如果Airport拥有并摧毁AirlineS您需要确保在实施中遵守三级规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM