1

我刚开始使用 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?

Q4是我最关心的一个,我应该总是使用new关键字来添加我的军队吗?

Q5:有没有比增加兔子更好的方法:

rabbitArmy.push_back(*rabbitOnHeap);
4

1 回答 1

2
  1. 由于您没有另外指定,因此您放入向量中的对象将被分配std::allocator<rabbit>,它使用new. 对于它的价值,这通常被称为“免费存储”而不是堆1
  2. 同样,通常的术语是免费商店。
  3. 正式地说,那是“自动存储”,但是是的,在您的典型实现上将是堆栈,并且在不支持硬件堆栈的实现上,它仍然是类似堆栈(LIFO)的数据结构某种意义上的。
  4. 当您将项目添加到向量(或其他标准容器)时,实际添加到容器中的是您作为参数传递的项目的副本。您作为参数传递的项目仍由您自己处理。对于具有自动存储类的东西,它会在超出范围时被销毁——但它在集合中的副本将保持有效,直到它被擦除或集合被销毁等。
  5. 不。事实上,您应该很少使用它new来分配要放入标准集合中的项目。由于数组中的项目将是您传递的内容的副本,因此您通常不需要使用new来分配它。
  6. 通常你只是推回一个本地对象。

例如:

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

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


  1. 在典型用法中,“堆”是指由callocmallocrealloc和管理的内存free。什么newdelete管理的是免费商店。反过来,新表达式从operator new(全局或类内部)获取内存。operator newoperator delete被指定,因此它们几乎可以分别直接传递到mallocfree,但即使在这种情况下,堆和空闲存储通常也是分开考虑的。
于 2013-02-13T05:02:02.687 回答