在函数内部创建一个局部向量,然后将其作为引用传递给其他函数,这些函数将其存储为引用
Creating a local vector inside a function, then pass it as a reference to other functions which store it as a reference
此代码中是否存在任何潜在危险?
void f(){
std::vector<int> v;
...
g(v);
}
void g(std::vector<int> &a){
... //store a by reference in variable blah (global)
}
当对f()的调用完成时,v被销毁,但blah仍将引用v。blah会无效吗?有没有更好的方法可以做到这一点,同时不制作不必要的矢量副本?
除了James提供的答案外,还有第三种可能性,具有与第一个想法相同的可读性,没有悬挂引用,没有向量本身的堆分配,也没有不必要的副本:
std::vector<int> global; //somewehere - you don't have it really global, do you?
void f() {
std::vector<int> vf;
/* ... */
g(std::move(vf));
}
void g(std::vector<int> vg) //by value!
{
/* ... */
global.swap(vg);
}
由于您将vf
"移出"f()
,因此会调用vg
的move ctor,这意味着它只拥有vf
以前拥有的资源的所有权,因此不会进行不必要的复制和分配。g()
中的swap()
仅在global
存在于对g()
(从而f()
)的调用之前的情况下工作。您说过要将向量存储在引用中,所以我假设g()
实际上创建了存储对象,并且在调用之前没有global
。然后,vg
不应与现有对象交换,而应仅通过std::move
传递给存储对象。
总的来说,你只创建了一个向量(vf
),所有其他向量都是一样的,move
从原始向量开始,所以你的性能基本上与通过参考向量相同,但没有悬挂参考。
(对于挑剔的人来说:是的,移动矢量比传递ref有点多,通常是复制三个指针并将其归零,而不是复制一个。但与堆分配、矢量复制等相比,这真的算不了什么。)
是的,存在您描述的问题。在堆上创建v
void f()
{
std::vector<int>* v = new std::vector<int>();
// ...
g(v);
}
void g(std::vector<int>* a)
{
// Store in blah
// But don't forget to delete it.
}
或者从一开始就将其作为全局。
std::vector<int> v;
void f()
{
g();
}
void g()
{
// Use v;
}
相关文章:
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 类 Referention 中C++回调函数引用非静态函数
- 使用函数引用指向节点的指针删除链表中的节点?
- 解释通过从函数引用返回数组的语法
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 使用默认构造函数引用成员变量初始化错误
- 无法调用函数引用 c++
- 使用 decltype(this) 获取函数引用
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 从内联函数引用文件静态变量
- Boost::将sigaction函数引用绑定到实例
- 一种比函数引用更有效的方法
- 奇怪的未定义函数引用,函数调用C++不存在
- 是否可以检测绑定成员函数引用的对象是否被删除或销毁
- 构造函数引用参数导致seg错误
- 是否可以使函数模板从函数引用中获取“decltype”
- 无法让 Lua 函数引用"self"
- 如何解析变量和函数引用(Linker & Compiler)?
- 从不同模块调用函数 - 引用错误
- 如何在主函数中连接到数据库,然后从其他函数引用它