在下列情況下,我的對象超出範圍,我訪問了無效的指針:如何防止臨時超出範圍?
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
}
我想,以防止這將是構建動物對象在向量地方的最佳方式,但我不不知道該怎麼做。我想過做:
list.push_back(Dog());
但是,這仍然會創建一個臨時的,除非它優化掉,因爲在另一個地方(另一個編譯器)我寧願不依賴於它可能不會做同樣的事情。
編輯:感謝雷米勒博我已經學會了,你可以直接在載體,沒有臨時工,沒有拷貝構造一個矢量元素,用函數:
template< class... Args >
void emplace_back(Args&&... args);
我不知道怎麼一個可變模板參數有效,但描述如下:
將新元素追加到容器的末尾。通過std :: allocator_traits :: construct構造的元素是 ,通常 使用placement-new在容器提供的位置 處就地構造元素。參數args ...作爲std :: forward(args)被轉發到 的構造函數中......
我不明白這個問題。你是不是要求你把不是默認構造的東西放到'std :: vector'中? –
這不是'reserve()'的作用。 –
「之後我使用我的vectorOfAnimals [0]並訪問一個無效指針」你對「無效指針」的含義是什麼?它在哪裏? – songyuanyao