将最初在堆栈上的对象推送到向量,对象是否会丢失?

时间:2013-02-13 04:49:09

标签: 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 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?
第四季是我最关心的问题,如果我总是使用 new 关键字将兔子加入我的军队?

问题5:是否有更好的方法将兔子加入军队:

rabbitArmy.push_back(*rabbitOnHeap);

1 个答案:

答案 0 :(得分:2)

  1. 由于您未另行指定,因此您在向量中输入的对象将使用std::allocator<rabbit>进行分配,该new使用new。对于它的价值,那个通常称为“免费商店”而不是堆 1
  2. 同样,通常的术语是免费商店。
  3. 官方说,这是“自动存储”,但是,在您的典型实现中,这将是堆栈,并且在不支持硬件堆栈的实现上,它仍然是堆栈式(LIFO) )某种数据结构。
  4. 当您向向量(或其他标准容器)添加项目时,实际添加到容器的是您作为参数传递的项目的副本。您作为参数传递的项目仍然可以随意使用。对于具有自动存储类的东西,当它超出范围时它将被销毁 - 但是它在集合中的副本将一直有效,直到它被删除或集合被破坏等为止。
  5. 否。实际上,您应该很少使用new来分配您要放入标准集合中的项目。由于数组中的项目将是您传递的内容的副本,因此通常不需要使用for (i=0; i<10; i++) rabbitArmy.push_back(rabbit()); 来分配它。
  6. 通常你只需要推回一个本地对象。
  7. 例如:

    rabbit

    这会创建10个临时rabbit()个对象(calloc部分),并将每个对象的副本添加到rabbitArmy中。然后每个临时人员都被摧毁了,但是他们在兔子军队中的副本仍然存在。


    1. 在典型用法中,“堆”是指由mallocreallocfreenew管理的内存。 deleteoperator new管理的是免费商店。反过来,新表达式从operator new(全局或类内)获取内存。指定了operator deletemalloc,因此 几乎可以分别直接传递给free和{{1}},但即使是这样的话也是如此堆和免费商店通常被认为是分开的。