c++ - 如果在堆上创建 vector ,是否意味着我可以从任何其他函数访问它?怎么样?

标签 c++ pointers heap-memory

该语句在堆上创建一个 vector :

std::vector<int>* pVector = new std::vector<int>();
因此,如果我在main()或某处声明它,如何在另一个函数中访问它?例如:
#include <iostream>
#include <vector>
    
void insert(int value);

int main (){
    int n = 1;
    std::vector<int>* pVector = new std::vector<int>();
    insert(n);
    return 0;
}

void insert (int value){
    pVector->push_back(value); //ERROR "was not declared in this scope"
    std::cout << pVector[0] << "\n"; //ERROR
}
我正在独自学习和学习,指针和引用比我预期的要复杂得多,因此,我们将不胜感激。

最佳答案

这与堆使用无关。pVector只是main()的局部变量,因此只有main()可以使用它。从任何其他函数访问std::vector对象的唯一方法是显式传递指向它的指针/引用。
您可以使用输入参数来传递它,例如:

#include <iostream>
#include <vector>
    
void insert(std::vector<int>& vec, int value);

int main (){
    int n = 1;

    std::vector<int>* pVector = new std::vector<int>();
    insert(*pVector, n);
    ...
    delete pVector;

    /* this works, too:
    std::vector<int> vec;
    insert(vec, n);
    ...
    */

    return 0;
}

void insert (std::vector<int>& vec, int value){
    vec.push_back(value);
    std::cout << vec[0] << "\n";
}
或者,您可以使用全局变量,例如:
#include <iostream>
#include <vector>
    
std::vector<int>* pVectorToInsertInto;
void insert(int value);

int main (){
    int n = 1;

    std::vector<int>* pVector = new std::vector<int>();
    pVectorToInsertInto = pVector;
    insert(n);
    ...
    delete pVector;

    /* this woks, too:
    std::vector<int> vec;
    pVectorToInsertInto = &vec;
    insert(n);
    ...
    */

    return 0;
}

void insert (int value){
    pVectorToInsertInto->push_back(value);
    std::cout << (*pVectorToInsertInto)[0] << "\n";
}
通常,如果可以避免,请不要使用全局变量。

关于c++ - 如果在堆上创建 vector ,是否意味着我可以从任何其他函数访问它?怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63693871/

相关文章:

c - char *derp[20] 是什么意思?

c - 解引用迭代器性能

c++ - 是否可以对全局运算符 `new` 和 `delete` 执行回调?

c++ - nuget 包管理器包含在 VS 2015 中设置的目录在哪里?

c++ - 将文件类型关联到正在运行的应用程序

c++ - 如何查看预处理后文件的外观?

java - JVM 堆未释放

c++ - 为什么 while(std::ifstream >> s) 有效?

c - 为什么 fgets() 返回指向新填充的 char 数组的指针?

c++ - dbgheap.c 抛出访问冲突异常