Vector 将堆栈上最初的对象推到一个向量,对象会丢失吗?

Vector 将堆栈上最初的对象推到一个向量,对象会丢失吗?,vector,stl,stack,heap,Vector,Stl,Stack,Heap,我刚开始使用STL,比如说我有一个兔子类,现在我正在创建一个兔子军队 #include <vector> vector<rabbit> rabbitArmy (numOfRabbits,rabbit()); //Q1: these rabbits are on the heap right? rabbit* rabbitOnHeap = new rabbit(); //Q2: rabbitOnHeap is on the heap right? rabbit r

我刚开始使用STL,比如说我有一个兔子类,现在我正在创建一个兔子军队

#include <vector>

vector<rabbit> rabbitArmy (numOfRabbits,rabbit()); 
//Q1: these rabbits are on the heap right?

rabbit* rabbitOnHeap = new rabbit(); 
//Q2: rabbitOnHeap is on the heap right?

rabbit rabbitOnStack; 
//Q3: this rabbit is on the stack right?

rabbitArmy.push_back(rabbitOnStack); 
//Q4: rabbitOnStack will remain stored on the stack? 
//And it will be deleted automatically, though it's put in the rabbitArmy now?
  • 因为您没有另外指定,所以放入向量中的对象将使用
    std::allocator
    进行分配,它使用
    new
    。不管它值多少钱,它通常被称为“免费商店”,而不是heap1
  • 同样,通常的术语是免费商店
  • 正式来说,这是“自动存储”,但是的,在您的典型实现中,这将是堆栈,而在硬件中不支持堆栈的实现中,它仍然是某种类似堆栈(LIFO)的数据结构
  • 将项添加到向量(或其他标准容器)时,实际添加到容器的是作为参数传递的项的副本。作为参数传递的项仍然是您自己的,您可以随意处理。对于具有automatic storage类的对象,当它超出范围时,它将被销毁——但集合中它的副本将保持有效,直到它被擦除或集合被销毁,等等
  • 不可以。事实上,您应该很少使用
    new
    来分配要放入标准集合中的项目。由于数组中的项将是传递内容的副本,因此通常不需要使用
    new
    来分配它
  • 通常,您只需向后推一个局部对象 例如:

    for (i=0; i<10; i++)
        rabbitArmy.push_back(rabbit());
    
    (i=0;i)的
    
    
    for (i=0; i<10; i++)
        rabbitArmy.push_back(rabbit());