C++中按指针传递vector时,指针是否会失效?
关于std::vector指针/引用传递后添加元素的疑问解答
1. 传入的vector指针会不会失效?
不会失效。你传入的指针指向的是vector对象本身,而非它内部存储元素的缓冲区。当vector因元素过多触发扩容时,只会重新分配内部的元素存储内存、移动/复制元素到新缓冲区,但vector对象自身的内存地址不会改变。只要main函数里的myVec对象还处于有效生命周期(比如调用myVecFunc期间它没被销毁),这个指针就一直能正常访问vector。
2. 按引用传递是否存在同样问题?
完全不存在。引用本质是vector对象的别名,和指针一样,绑定的是vector对象本身。扩容操作只会改变vector内部的存储状态,不会影响vector对象自身的地址,因此引用始终有效。
3. 内存重定位会不会导致悬垂指针?
不会。悬垂指针是指向已被释放内存的指针,但你这里的指针指向的是vector对象,而非它内部的元素缓冲区。扩容时释放的是旧的元素缓冲区,和vector对象本身无关,所以不会出现悬垂指针的问题。
注意:如果在扩容前获取了vector元素的指针、迭代器或引用,这些会在扩容后失效,但这和你传入的vector指针/引用是两回事。
4. 添加大量元素或大对象的情况
不管添加多少元素、对象体积多大,只要vector对象本身还活着(比如myVec在myVecFunc执行期间未被销毁),传入的指针/引用就不会失效。扩容是vector内部的管理逻辑,不会影响外部指向vector对象的指针或引用。
你的示例代码(修正后):
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); }
内容的提问来源于stack exchange,提问作者mash
相关产品推荐
相关产品推荐

