这是否会完全清除 class 对象的动态分配结果?
Will this completely clean up the result of dynamic allocation of a class object?
所以我用这段代码动态分配了一个class对象:
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
中动态分配使用的内存吗? (这与我对调用 class 解构函数时是否需要 delete[]
的困惑有关)
对于不是“关键任务”的问题,我深表歉意,只是想确保我不会继续错误的做法,因为我真的在尽可能完美地编程...
Will this deleteInventoryItem
function successfully free up the memory used by the dynamic allocation in createNewInventoryItem
?
不,您的代码确实泄漏了内存。你在这里做什么,
m_inventory.at(posInVector)->~InventoryItems();
正在显式调用容器元素的析构函数。这确实会清除特定对象持有的所有资源,但不会清除托管对象本身的内存资源。必须手动调用对象的析构函数的情况非常非常少(我能想到的唯一情况是使用放置 new
,而你很少需要它)。
你可以做的是使用 delete
来清理内存 和 调用被删除元素的析构函数。但是作为这种手动内存管理的更安全的替代方案,我建议您选择以下两个选项之一
如果应该存储在容器中的对象可以按值复制(即不是多态类型并且你想存储基础 class 引用),只需存储它的价值:
std::vector<InventoryItems> myData;
否则,存储一个 std::unique_ptr
来为您处理所有内存管理:
std::vector<std::unique_ptr<InventoryItems>> myData;
不,它会内存泄漏。您显然是在调用析构函数,但不调用 delete
,它是 new
的对应项。 new
后跟类型首先分配内存,然后隐式调用析构函数。 delete
运算符还做了两件事,首先调用析构函数,然后释放内存。
很少需要显式调用析构函数,专门用于清理通过 new
placement syntax. 创建的实例,而不调用 ~
它在这种情况下会导致泄漏,如果实例包含通过成员或基础 class(es).
持有动态绑定的资源
根据经验,请记住这些对:
obj = new Class;
需要 delete obj;
obj = new (buffer) Class
需要 obj->~Class();
array = new Class[count];
需要 delete [] array;
...以及作为集合中最重要的自动对象:
Class obj;
需要(nothing)
但是封闭范围的结尾
最后一个“对”显示对(默认)构造函数的隐式调用(它可以是 Class
定义提供的任何其他构造函数)并以隐式调用结束(在右大括号处)析构函数,顺便说一句,C++ 语言将 class 的析构函数限制为最多一个的原因:编译器依赖于这种唯一性才能自动关闭作用域。这种自动性也构成了 std::unique_ptr and std::shared_ptr.
的基础
所以我用这段代码动态分配了一个class对象:
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
中动态分配使用的内存吗? (这与我对调用 class 解构函数时是否需要 delete[]
的困惑有关)
对于不是“关键任务”的问题,我深表歉意,只是想确保我不会继续错误的做法,因为我真的在尽可能完美地编程...
Will this
deleteInventoryItem
function successfully free up the memory used by the dynamic allocation increateNewInventoryItem
?
不,您的代码确实泄漏了内存。你在这里做什么,
m_inventory.at(posInVector)->~InventoryItems();
正在显式调用容器元素的析构函数。这确实会清除特定对象持有的所有资源,但不会清除托管对象本身的内存资源。必须手动调用对象的析构函数的情况非常非常少(我能想到的唯一情况是使用放置 new
,而你很少需要它)。
你可以做的是使用 delete
来清理内存 和 调用被删除元素的析构函数。但是作为这种手动内存管理的更安全的替代方案,我建议您选择以下两个选项之一
如果应该存储在容器中的对象可以按值复制(即不是多态类型并且你想存储基础 class 引用),只需存储它的价值:
std::vector<InventoryItems> myData;
否则,存储一个
std::unique_ptr
来为您处理所有内存管理:std::vector<std::unique_ptr<InventoryItems>> myData;
不,它会内存泄漏。您显然是在调用析构函数,但不调用 delete
,它是 new
的对应项。 new
后跟类型首先分配内存,然后隐式调用析构函数。 delete
运算符还做了两件事,首先调用析构函数,然后释放内存。
很少需要显式调用析构函数,专门用于清理通过 new
placement syntax. 创建的实例,而不调用 ~
它在这种情况下会导致泄漏,如果实例包含通过成员或基础 class(es).
根据经验,请记住这些对:
obj = new Class;
需要delete obj;
obj = new (buffer) Class
需要obj->~Class();
array = new Class[count];
需要delete [] array;
...以及作为集合中最重要的自动对象:
Class obj;
需要(nothing)
但是封闭范围的结尾
最后一个“对”显示对(默认)构造函数的隐式调用(它可以是 Class
定义提供的任何其他构造函数)并以隐式调用结束(在右大括号处)析构函数,顺便说一句,C++ 语言将 class 的析构函数限制为最多一个的原因:编译器依赖于这种唯一性才能自动关闭作用域。这种自动性也构成了 std::unique_ptr and std::shared_ptr.