如果我有类似下面的代码,我传递一个向量指针(例如它可以为空),然后在被调用的函数中向向量添加项,是否有我的向量指针变得无效的危险?通过引用传递也是如此。由于向量保证在内存中是连续的,并且会根据需要重新分配,因此是否存在因为向量在内存中重新定位而获得悬空指针的危险?下面的代码很简单,但是如果 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);
}
坦白说,你有两个根本性的误解。
首先,将指针传递给函数:函数参数是按值传递的(除非使用引用),指针也不例外:
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
是有效输入时,才应该通过指针传递参数。否则请使用参考。