假设我创建了两个 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
内部)都不可访问吗? vector1
和foo1
中foo2
的内容是否会影响原始 vector ? vector1
在作用域末尾会自动销毁吗?还是我们必须手动将其删除? 最佳答案
正确的。
它只是vector1
的名称,无法从外部访问,但是您可以自由传递其地址(通过引用或指针传递)。当然,只要函数不返回,它就一直存在,因此返回指向它的指针将是一个错误(因为它将指向不再存在的对象)。
这与堆上的分配不同,堆上的分配没有作用域绑定(bind)的生存期或自动删除-留给您。这是一把双刃剑:您可以拥有具有自定义生命周期的对象,但是您必须记住,当不再需要它们时,请对它们进行delete
编码。
foo1
的参数是一个新的,分离的 vector ,对其进行的任何修改都将保留在该函数的本地。相反,foo2
的参数引用vector1
,因此它将影响原始 vector (实际上,对于其他对象,引用通常被描述为“别名”)。
它会像任何局部变量一样被自动销毁。但是:vector2
将必须手动删除,因为本地对象只是指针,没有析构函数(默认情况下,它不拥有它指向的对象)。