请帮助解决这个问题。 我有一些泄漏的代码,我不知道如何处理它
vector <ItemClass> items( 10 );
items[1] = ItemClass( "DVD Player", 560 );
items[5] = * new ItemClass( "Blu Ray Player", 900 );
我应该如何为物品[5]释放内存? 我在尝试释放内存方面遇到错误
delete &items[5];
delete [] &items[5];
我甚至试过像
这样的东西ItemClass * delItem = &items[5];
items[5] = item4;
delete delItem;
我在VS2010 Ultimate中得到了“腐败堆”
答案 0 :(得分:1)
您不会在您不拥有的对象上调用delete
。您没有items[5]
。 items
向量拥有它。
delete
所需的ItemClass
对象是您当前正在泄漏的对象,即您通过new ItemClass(...)
创建的对象,然后复制到items[5]
。< / p>
ItemClass *temp = new ItemClass("Blue Ray Player", 900);
items[5] = *temp;
delete temp;
如果要从矢量中删除items[5]
,请让矢量将其删除:
items.erase(items.begin() + 5);
请注意,这可能效率很低,因为向量中的所有后续项都必须向下移动一个位置,这需要为每个移动的项调用ItemClass
赋值运算符一次。
您可能希望使用指向ItemClass
的指针向量,或shared_ptr
s或boost::ptr_vector
的向量。
答案 1 :(得分:1)
在代码中的向量中存储新分配的对象有一种奇怪的用法和混淆。通常你应该以相同的方式处理列表。因此,我下面的例子将更加明确,彼此独立,这有助于您理解差异。
仅将delete
用于对象。请参阅下面的代码。
仅将delete []
用于“本机”数组,而不是用于向量或类似容器类或其中的对象。
我不会举例说明数组,因为数组可能更容易混淆。
默认示例堆栈:
vector <ItemClass> items( 10 );
// does not need to be deleted because item is on the stack
ItemClass item("device1", "10");
items.push_back(item);
堆分配的默认示例:
vector <ItemClass*> items( 10 );
ItemClass* pItem = new ItemClass("device2", "20");
items.push_back(pItem);
// delete all items inside vector
for (int i = 0; i < items.size(); i++)
{
ItemClass* pToDelete = items[i];
delete pToDelete;
items.erase(i);
}
应避免使用以下示例,仅用于澄清事项!使用风险自负。
存储堆栈变量的地址:
vector <ItemClass*> items( 10 );
// does not need to be deleted because item is on the stack
ItemClass item("device3", "30");
items.push_back( &item ); // storing a reference to item
// No need to delete this item that points to something on the stack.
// However you might not be able to tell items apart which have been
// created on the heap or the stack, so just dont do it.
如果你混淆之前的例子并存储引用和指针,你必须自己处理它。我的建议:不要这样做。
存储取消引用的项目:
vector <ItemClass> items( 10 );
ItemClass* pItem = new ItemClass("device4", "40");
items.push_back(*pItem);
// must be deleted because allocated on the heap
// Again you can not tell which item is allocated on stack or heap. Avoid this.