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

标签 c++ memory-management

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

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

存储在这个 vector 中: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[] 的困惑有关)

对于不是“关键任务”的问题,我深表歉意,只是想确保我不会继续错误的做法,因为我真的在尽可能完美地编程...

最佳答案

Will this deleteInventoryItem function successfully free up the memory used by the dynamic allocation in createNewInventoryItem?

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

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

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

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

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

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

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

关于c++ - 这会彻底清除类对象动态分配的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66363456/

相关文章:

c++ - 如何在 Boost Unit 中正确定义派生单位

c++ - 使用 QProcess 运行自定义可执行文件,立即退出,退出代码为 1

c# - 内存中集合的大小与磁盘上集合的大小

c++ - 在 C++ 中处理大尺寸 vector

c++ - Ofstream,使用变量命名

c++ - 如何测试两个文件中是否有一个?

c++ - 二年级搬家

java - 转换在 Java 中需要多少处理和内存使用?

java - 将值存储为变量或再次调用方法更好吗?

c++ - 如何自己管理内存? memory_manager.exe : 0xC0000005: Access violation reading location 0x00000004 中 0x00423e3b 处未处理的异常