Не използвайте израз new[]
за това. Векторът не работи така. Това, което правите, е да разпределите част от сурова памет. Можете да използвате malloc за това или можете да използвате оператор new, който е различен от новия израз. Това по същество прави функцията-член reserve()
на std::vector
, ако приемем, че сте използвали разпределителя по подразбиране. Той не създава никакви реални обекти по начина, по който го прави изразът new[]
.
Когато искате да конструирате елемент, използвате placement new, като му предавате местоположение някъде в необработената памет, която сте заделили. Когато искате да унищожите елемент, извиквате директно неговия деструктор. Когато сте готови, вместо да използвате израза delete[]
, използвате operator delete
, ако сте използвали operator new
, или използвате free()
, ако сте използвали malloc
.
Ето пример за създаване на 10 обекта и унищожаването им в обратен ред. Бих могъл да ги унищожа във всякакъв ред, но ето как бихте го направили във векторна реализация.
int main()
{
void * storage = malloc(sizeof(MyClass) * 10);
for (int i=0; i<10; ++i)
{
// this is placement new
new ((MyClass*)storage + i) MyClass;
}
for (int i=9; i>=0; --i)
{
// calling the destructor directly
((MyClass*)storage + i)->~MyClass();
}
free(storage);
}
pop_back
ще бъде имплементирано чрез просто извикване на деструктора на последния елемент и намаляване на променливата член size с 1. Това не би, не трябва (и не може, без да прави куп ненужни копия) да освободи никаква памет.
person
Benjamin Lindley
schedule
04.11.2012
vector::pop_back
? Повторното изобретяване на колелото ще ви създаде повече проблеми, отколкото си струва. - person Casey   schedule 04.11.2012vector::pop_back
. Използвахint* p_array_of_values
като основна структура от данни. - person Slazer   schedule 04.11.2012