Не используйте для этого выражение new[]
. Вектор работает не так. Что вы делаете, так это выделяете кусок необработанной памяти. Для этого можно использовать malloc или использовать оператор new, который отличается от нового выражения. По сути, это то, что делает функция-член reserve()
для std::vector
, при условии, что вы использовали распределитель по умолчанию. Он не создает реальных объектов, как это делает выражение new[]
.
Когда вы хотите построить элемент, вы используете размещение 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