c++ - 分配在 "stack"上的 vector 可以在函数之间传递吗?

标签 c++ memory-management vector

我知道当函数完成执行时,分配在函数堆栈上的变量将变得不可访问。然而, 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/

相关文章:

c++ - 我正在尝试在 ALLEGRO c++ 中对许多墙进行整理

c++ - 在 C++ 中获取有符号整数乘法的高部分

c++ - 如何在 Visual Studio 2012 中创建 HelloWorld COM Interop

c++ - 如何通过右键单击区分驱动器或网络驱动器

ios - 在 iOS 应用程序中发布定制的 NSObject 类

c++ - STL 实现之间分配策略的差异?

linux - 常驻内存使用的概述/历史

c++ - vector 模板问题

c++ - 中值函数 C++ 的问题

c++ - Vector Add的STL算法