这会彻底清除类对象动态分配的结果吗?

所以我用这段代码动态分配了一个类对象:

void Inventory::createNewInventoryItem(std::string itemName, unsigned int maxQuantity, unsigned int orderThreshold, double price)
{
    InventoryItems* newItem = new InventoryItems;
    newItem->createInventoryItem(itemName, maxQuantity, orderThreshold, price);
    m_inventory.push_back(newItem);
}

存储在这个向量中: std::vector<InventoryItems*> m_inventory;

然后一旦对象使用完毕就deleteInventoryItem被调用,其定义为:

void Inventory::deleteInventoryItem(int posInVector)
{
    m_inventory.at(posInVector)->~InventoryItems();
    m_inventory.erase(m_inventory.begin() + posInVector);
}

我的问题是:这个deleteInventoryItem函数会成功释放中动态分配使用的内存createNewInventoryItem吗?(这与我在delete[]调用类解构器时是否需要有关的困惑有关)

对于不是“关键任务”的问题,我很抱歉,只是想确保我不会继续不良做法,因为我真的在努力尽可能完美地编程......

回答

这个deleteInventoryItem函数会成功释放动态分配使用的内存createNewInventoryItem吗?

不,您的代码确实会泄漏内存。你在这里做什么,

m_inventory.at(posInVector)->~InventoryItems();

显式调用容器元素的析构函数。这确实会清除特定对象持有的任何资源,但不会清除托管对象本身的内存资源。您必须手动调用对象的析构函数的情况非常非常罕见(我能想到的唯一情况是使用 position new,而您很少需要它)。

您可以做的是使用delete来清理内存调用被擦除元素的析构函数。但是作为这种手动内存管理的更安全的替代方案,我建议您选择以下两个选项之一

  1. 如果应该存储在容器中的对象可以通过值复制(即不是多态类型并且您想要存储基类引用),只需按值存储它:

    std::vector<InventoryItems> myData;
    
  2. 否则,存储一个std::unique_ptr它会为您处理所有内存管理:

    std::vector<std::unique_ptr<InventoryItems>> myData;
    

以上是这会彻底清除类对象动态分配的结果吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>