我知道当函数完成执行时,分配在函数堆栈上的变量将变得不可访问。然而, vector 类型将它们的元素分配在堆上,无论它们是如何分配的。例如,
vector<int> A;
会在堆上而不是栈上为其元素分配空间。
我的问题是,假设我有以下代码:
int main(int argc, char *argv[]) {
// initialize a vector
vector<int> A = initVector(100000);
// do something with the vector...
return 0;
}
// initialize the vector
vector<int> initVector(int size) {
vector<int> A (size); // initialize the vector "on the stack"
// fill the vector with a sequence of numbers...
int counter = 0;
for (vector<int>::iterator i = A.begin(); i != A.end(); i++) {
(*i) = counter++;
}
return A;
}
在main函数中使用vector A会不会出现内存访问问题?我尝试了几次,它们都正常工作,但我担心这可能只是运气。
我的看法是, vector A 在堆上分配其元素,但它有一些分配在栈本身上的“开销”参数(可能是 vector 的大小)。因此,如果这些参数被另一个分配覆盖,则在 main 函数中使用 vector 可能会导致内存访问问题。有什么想法吗?
最佳答案
当您执行“返回 A;”时您按值返回,因此您获得了 vector 的拷贝——C++ 创建一个新实例并在其上调用复制构造函数或 operator=。因此,在这种情况下,内存的分配位置并不重要,因为您无论如何都必须复制它并销毁旧拷贝(尽管有一些可能的优化)。
vector (和所有其他 STL 容器)中的数据也按值移动,因此您存储整数的拷贝,而不是指向它们的指针。这意味着您的对象可以在任何容器操作中被复制多次,并且它们必须正确实现复制构造函数和/或赋值运算符。默认情况下,C++ 会为您生成这些变量(只需对所有成员变量调用 copy ctor),但它们并不总是做正确的事情。
如果您想在 STL 容器中存储指针,请考虑使用共享指针包装器(std::shared_ptr 或 boost::shared_ptr)。他们将确保正确处理内存。
关于c++ - 分配在 "stack"上的 vector 可以在函数之间传递吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047369/