В следующем случае моего объекта выходит из области видимости и получить доступ к недопустимому указателю:Как предотвратить временный выход из сферы действия?
struct Animal
{
char* buffer;
Animal() { buffer = new char[100]; }
~Animal() { delete[]buffer; }
};
int main()
{
vector<Animal> list;
{
Animal dog;
list.push_back(dog);
}
list[0].buffer[50] = 7; // Buffer's been deleted, can't access it
}
я думаю, что лучший способ, чтобы предотвратить это было бы построить объект Animal на месте в векторе, но дон Не знаю, как это сделать. Я думал о выполнении:
list.push_back(Dog());
Но это по-прежнему создает временный характер, если она не оптимизирована в сторону, и я предпочел бы не полагаться на это, потому что в другом месте (другой компилятор), он не может делать то же самое.
Edit: Благодаря Реми Лебо я узнал, вы можете построить вектор элемент непосредственно в векторе, нет временных, ни копирования, с помощью функции:
template< class... Args >
void emplace_back(Args&&... args);
Я не знаю, как VARIADIC шаблон аргументов работает, но описание:
Добавляет новый элемент в конец контейнера. Элемент равен , построенный по std :: allocator_traits :: construct, который обычно использует новое размещение для создания элемента на месте в месте , предоставляемом контейнером. Аргументы арг ... направляются в конструктор как станд :: вперед (арг) ....
Я не понимаю вопроса. Вы просите вас помещать вещи, которые не являются конструктивными по умолчанию в 'std :: vector'? –
Это не то, что делает 'reserve()'. –
«После этого я использую свой vectorOfAnimals [0] и получаю недопустимый указатель« Что вы имеете в виду под «недопустимым указателем»? Где это? – songyuanyao