假设我创建了两个 vector ,一个 vector 在堆上,另一个在堆栈上:

Vector<int> vector1;
Vector<int>* vector2 = new Vector<int>;

然后,我将vector1传递给两个函数,例如foo1(Vector<int>)foo2(Vector<int>&)。我还将vector2传递给foo3(Vector<int>*)

由于我是C++的新手,所以我对这里的行为差异感到困惑。
  • 我是否正确地说,对于foo1,整个vector1被复制,对于foo2,仅对vector1的引用被传递到函数中?
  • 但是,不是在堆栈上声明的vector1,除了创建它的作用域之外,在其他任何地方(即,从foo2内部)都不可访问吗?
  • 另外,修改vector1foo1foo2的内容是否会影响原始 vector ?
  • 并且vector1在作用域末尾会自动销毁吗?还是我们必须手动将其删除?
  • 最佳答案



    正确的。



    它只是vector1的名称,无法从外部访问,但是您可以自由传递其地址(通过引用或指针传递)。当然,只要函数不返回,它就一直存在,因此返回指向它的指针将是一个错误(因为它将指向不再存在的对象)。

    这与堆上的分配不同,堆上的分配没有作用域绑定(bind)的生存期或自动删除-留给您。这是一把双刃剑:您可以拥有具有自定义生命周期的对象,但是您必须记住,当不再需要它们时,请对它们进行delete编码。


    foo1的参数是一个新的,分离的 vector ,对其进行的任何修改都将保留在该函数的本地。相反,foo2的参数引用vector1,因此它将影响原始 vector (实际上,对于其他对象,引用通常被描述为“别名”)。



    它会像任何局部变量一样被自动销毁。但是:vector2将必须手动删除,因为本地对象只是指针,没有析构函数(默认情况下,它不拥有它指向的对象)。

    09-30 17:47