Существует странное использование и смешивание хранения новых выделенных объектов в векторах в вашем коде. Обычно вы должны обрабатывать списки одинаково. Таким образом, приведенные ниже примеры будут более явными и независимыми друг от друга, что должно помочь вам понять различия.
Используйте 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.