这两个向量语句有什么区别?

时间:2011-08-09 15:48:39

标签: c++

[!!对第二个代码进行了更正!!]

vector<int> a;
vector<int>*p = &a;

vector<int>*b = new vector<int>();

我知道在第一个场景中,a在堆栈上,第二个b在堆上。但是,还有其他差异吗?就像消耗的内存等等。

7 个答案:

答案 0 :(得分:3)

是向量b在堆上分配,向量a在堆栈上(假设代码在方法的范围内)以及堆栈上的4字节指针。消耗内存的其他差异取决于内存管理器以及它如何分配块以及堆所需的任何内部簿记。

答案 1 :(得分:3)

  

我知道在第一个场景中,a在堆栈上,第二个b在堆上。

该陈述的两个部分都是错误的。 主要是因为术语堆栈/堆在描述C ++对象时没用。

 vector<int>   a;

这是automatic storage duration object。通常称为automatic对象。

它是在第一次使用时创建的,当它超出范围时会被销毁。范围的定义取决于上下文。如果您在函数中,它将被放置在堆栈中并在函数存在时被销毁。如果它是一个对象的成员,那么它就是用对象创建的,并用对象销毁(在这种情况下,对象可以在堆或堆栈上)。

相反:

vector<int>*   p = &a;

这是指向对象的指针。它指向的是什么。在这种情况下,您将它指向一个自动对象(如上所述可能位于堆栈或堆上)。

最后:

vector<int>*   q = new vector<int>();

这是指向dynamic storage duration对象的指针。这意味着它是用new创建的,必须手动销毁(这也是你永远不会创建RAW指针的原因,它们总是包含在智能指针中(请阅读一本书))。如果这个对象在堆栈或堆上取决于很多东西,因为语言允许你覆盖默认行为(以一种简单的天真方式你可以把它想象成在堆上(但最好忘记这个概念)堆和堆栈,因为它们不适用于C ++)。

最好考虑属于以下四种类别之一的对象:

  • 静态存储持续时间对象
    • 全局变量(以及其他一些事项)
    • 您可以将这些(直到您知道更多)想象为在主要
    • 之后主要销毁之前创建的
  • 线程存储持续时间对象
    • 与线程关联的全局。
    • 您可以将这些视为在线程
    • 之后销毁的线程创建的
  • 自动存储持续时间对象
    • 几乎所有其他物品
    • 这些是在第一次遇到时创建的。
    • 当他们超出范围时被摧毁。
    • 范围取决于背景。
  • 动态存储持续时间对象
    • 使用new分配的对象和使用delete删除的对象。
    • 应包含在智能指针或容器中的对象

答案 2 :(得分:2)

两个向量都将为堆上的元素分配内存。 主要区别在于矢量对象的生命周期。在第一种情况下,它位于堆栈中,并将在其范围的末尾被销毁。

在第二种情况下,向量将保留在内存中,直到您调用delete q。

答案 3 :(得分:1)

原始问题:

你在问,

之间有什么区别
vector<int> a;
vector<int>*p = &a 

vector<int> b;
vector<int>* q=&b;

在这两种情况下,你都有一个向量,并声明一个初始化为指向向量的指针。额外的间接通常不是一个好主意。

p的声明中,你忘记了最后的分号,而在q的声明中,你并没有忘记这一点。

就是这样。

问题的第二个变体:

你在问,

之间有什么区别
vector<int> a;
vector<int>*p = &a 

vector<int>* q= new vector<int>();

在第一种情况下,您有一个向量,并声明一个初始化为指向向量的指针。额外的间接通常不是一个好主意。

在第二种情况下,您声明一个指向矢量的指针并将其初始化为指向通过new分配的零尺寸矢量。这不是一个好主意。向量为您执行内存管理,这很重要:只是对那个诱人的new说“不”。

就是这样。


干杯&amp;第h。,

答案 4 :(得分:0)

p和q只是向量的指针,它在栈上初始化。

在大多数平台上它应该只容纳4个字节。

答案 5 :(得分:0)

错误,p和q都是指向向量的指针,两者都分别指向a和b的地址。它们本质上是相同的,但我可能会像第二个例子那样生气。 ;)

这只是语法间距的轻微调整(第一个矢量对的第二行缺少一个分号。)。

答案 6 :(得分:0)

q是指向堆栈上的对象b的指针。指针对象只是一个地址(一个数字),而b是一个矢量实例