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();
显式调用容器元素的析构函数。这会清理特定对象所持有的任何资源,但不会清理承载对象本身的内存资源。您必须手动调用对象的析构函数是非常非常罕见的(我能想到的唯一情况是使用placement
new
,您很少需要它)

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

  • 如果应该存储在容器中的对象可以通过值进行复制(即,不是多态类型,您希望存储基类引用),只需通过值进行存储:

    std::vector<InventoryItems> myData;
    

  • 不,它会导致内存泄漏。显然,您正在调用析构函数,但没有调用与
    new
    对应的
    delete
    。紧跟着类型的
    new
    首先分配内存,然后隐式调用析构函数。
    delete
    操作符还做两件事,首先调用析构函数,然后释放内存

    很少需要显式调用析构函数,特别是用于清理通过创建的实例,如果实例包含通过成员或基类动态绑定的hold资源,则不调用它将导致泄漏

    根据经验,请记住以下几对:

    • obj=新类需要<代码>删除对象
    • obj=new(buffer)Class
      needs
      obj->~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;