所以我用这段代码动态分配了一个类对象:
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 increateNewInventoryItem
?
不,您的代码确实泄漏了内存。你在这里做什么,
m_inventory.at(posInVector)->~InventoryItems();
显式调用容器元素的析构函数。这确实会清除特定对象持有的所有资源,但不会清除托管对象本身的内存资源。必须手动调用对象的析构函数的情况非常非常少(我能想到的唯一情况是使用放置 new
,而您很少需要这种情况)。
您可以做的是使用delete
来清理内存和 调用被删除元素的析构函数。但是作为这种手动内存管理的更安全的替代方案,我建议您选择以下两个选项之一
如果应该存储在容器中的对象可以按值复制(即不是多态类型并且您想存储基类引用),只需按值存储它:
std::vector<InventoryItems> myData;
否则,存储一个
std::unique_ptr
来为您处理所有内存管理:std::vector<std::unique_ptr<InventoryItems>> myData;
关于c++ - 这会彻底清除类对象动态分配的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66363456/