C++ 这会彻底清除类对象动态分配的结果吗?
因此,我使用以下代码动态分配了一个类对象:C++ 这会彻底清除类对象动态分配的结果吗?,c++,memory-management,C++,Memory Management,因此,我使用以下代码动态分配了一个类对象: void Inventory::createNewInventoryItem(std::string itemName, unsigned int maxQuantity, unsigned int orderThreshold, double price) { InventoryItems* newItem = new InventoryItems; newItem->createInventoryItem(itemName,
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 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();
显式调用容器元素的析构函数。这会清理特定对象所持有的任何资源,但不会清理承载对象本身的内存资源。您必须手动调用对象的析构函数是非常非常罕见的(我能想到的唯一情况是使用placementnew
,您很少需要它)
您可以使用delete
清理内存并调用被擦除元素的析构函数。但是,作为这种手动内存管理更安全的替代方案,我建议您从以下两个选项中选择一个
如果应该存储在容器中的对象可以通过值进行复制(即,不是多态类型,您希望存储基类引用),只需通过值进行存储:
std::vector<InventoryItems> myData;
不,它会导致内存泄漏。显然,您正在调用析构函数,但没有调用与new
对应的delete
。紧跟着类型的new
首先分配内存,然后隐式调用析构函数。delete
操作符还做两件事,首先调用析构函数,然后释放内存
很少需要显式调用析构函数,特别是用于清理通过创建的实例,如果实例包含通过成员或基类动态绑定的hold资源,则不调用它将导致泄漏
根据经验,请记住以下几对:
obj=新类代码>需要<代码>删除对象代码>
obj=new(buffer)Class
needsobj->~Class()代码>
array=新类[count]代码>需要删除[]数组代码>
。。。而且,作为集合中最重要的,自动对象:
obj类
需要(无)
,但需要封闭范围的结尾
最后一个“对”显示对(默认)构造函数的隐式调用(它可以是类
定义提供的任何其他构造函数),并以析构函数的隐式调用结束(在右括号处),顺便说一下,C++语言将类的析构函数限制为最大值的原因:编译器依赖于这种唯一性,以便能够自动关闭范围。这种自动性也是和的基础。不会泄漏。显然,您正在调用析构函数,但没有调用与new
相对应的delete
。惯用的C++方法是为InventoryItems
提供一个构造函数,该构造函数执行createInventoryItem
所做的操作,将项按值存储在向量中的std::vector
,通过m\u inventory创建它们。将它们放回(itemName,…)
并在不再需要它们时将其删除。不需要手动内存管理。我完全忘记了在这种情况下智能指针。。。我的另一个愚蠢之处是,我得到了delete,只处理单个向量元素(之前不工作,因此进行了上述尝试)。问@lubgr,那么只有当它是多态类型时才需要创建指针向量吗?例如,是的,只有当你有多态类型时才需要。但是您当然可以在某些场景中希望引用其他地方的实例的引用集合-这可能是std::vector
,即指针向量。但是他们提到的例子应该是类似于std::vector
或std::vector
的东西。谢谢你,我感谢你的回答,他们真的帮助我理解了
std::vector<std::unique_ptr<InventoryItems>> myData;