当试图释放向量元素时泄漏

时间:2012-03-04 07:22:21

标签: visual-c++ memory-leaks

请帮助解决这个问题。 我有一些泄漏的代码,我不知道如何处理它

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中得到了“腐败堆”

2 个答案:

答案 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.