通过指针传递 C++ 向量时可以更改地址

问题描述 投票:0回答:1

如果我有类似下面的代码,我传递一个向量指针(例如它可以为空),然后在被调用的函数中向向量添加项,是否有我的向量指针变得无效的危险?通过引用传递也是如此。由于向量保证在内存中是连续的,并且会根据需要重新分配,因此是否存在因为向量在内存中重新定位而获得悬空指针的危险?下面的代码很简单,但是如果 myVecFunc 添加一百万个值或一些大对象怎么办?我见过遵循这种模式的库代码,但这样做似乎可能会遇到麻烦? 编辑:编辑代码以执行 *mVec->push_back(someNumber)

void myVecFunc(std::vector<double>* myVec)
{
     if (myVec != nullptr)
     {
        myVec->push_back(someNumber);
     }

}

int main(int argc, char* argv[])
{
   std::vector<double> myVec;
   myVecFunc(&myVec);
}
c++ std
1个回答
4
投票

坦白说,你有两个根本性的误解。

首先,将指针传递给函数:函数参数是按值传递的(除非使用引用),指针也不例外:

 void foo(int*);

 // usage
 int* x = nullptr;
 foo(x);
 assert( x == nullptr);

断言不可能失败,因为

foo
无法修改
x
。在您的示例中,
myVecFunc
无法修改
myVec
的地址。对象的内存位置与其身份相关。在一生中它不会改变。如果将矢量复制到不同的位置,您会得到一个副本。


下一个

std::vector
。向量内部存储一个指向用于元素的动态分配内存的指针。内存由向量正确管理。例如,您可以复制向量,它将复制元素。您可以通过指针或引用传递向量,完全没有问题。

当向量内部存储的指针获得不同的值时,在实际分配中会发生什么情况。因此这段代码不应该这样写:

std::vector<int> foo(2); // vector of size 2
int* ptr = foo.data();   // pointer to the internal array
foo.push_back(42);       // iterators and pointers are invalidated
std::cout << *ptr;       // DO NOT DERFERENCE THE INVALID POINTER !

总结:您显示的代码没有任何问题。但是,只有当

nullptr
是有效输入时,才应该通过指针传递参数。否则请使用参考。

© www.soinside.com 2019 - 2024. All rights reserved.