【问题标题】:Vector assignment problem向量分配问题
【发布时间】:2009-10-15 18:46:21
【问题描述】:
#include "iostream"
#include "vector"
using namespace std;

const vector<int>& Getv() 
{
vector<int> w(10);
w[0]=10;
cout<<w.size()<<endl;
return w;
}
//Now when I write in main:
vector<int>v = Getv();//Throws exception
//and the below rows has no effect
vector<int>v;
v=Getv()//w does not change

请问是什么问题?
哈尼·阿尔穆斯利...

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    您正在返回对局部变量的引用。当你退出函数时,它会被破坏。

    您需要退回一份:

    vector<int> Getv() 
    {
      vector<int> w(10);
      w[0]=10;
      cout<<w.size()<<endl;
      return w;
    }
    

    或者你可以将w设为静态:

    const vector<int>& Getv() 
    {
      static vector<int> w(10);
      w[0]=10;
      cout<<w.size()<<endl;
      return w;
    }
    

    您还应该在您的包含中使用&lt;&gt;,因为它们是标准库的一部分。

    【讨论】:

    • 非常感谢,但是为什么我必须在这里写静态,如果我返回一个 Student& 则我不必写它。我的意思是假设我返回的是 Student& 而不是 vector ?
    • 静态变量不存储在栈中,所以函数结束时不会被销毁。然后,返回引用是合法的。如果您要返回 Student& 并且您的学生对象不是静态的,那就是未定义的行为。
    • 执行我,但未定义的行为是什么意思。你的意思是它是正确的,但我不能这样做。实际上我无法想象它是如何工作的,因为在函数结束时它在逻辑上被销毁。但是当我返回 Student& 时它可以工作。非常感谢...
    • 你很幸运,未定义的行为意味着它可以按照你想要的方式工作,但情况并非总是如此。
    • Hani,这次运行在您的机器上运行并不意味着它是正确的。您不能返回对本地堆栈分配对象的引用,因为当函数结束时,它将消失。静态变量位于函数调用之间。
    【解决方案2】:

    您似乎混淆了返回参数和输入参数。 通过常量引用传递参数是安全的:

    void fun(const vector<int>& arg1)
    {
        //something
    }
    

    在该示例中,您仅传递引用,因此不会调用复制构造函数。

    但是从函数返回引用值(常量或非常量)是危险的。 见上文布鲁斯的回答。 您还可以延长参考寿命:

    const vector<int>& Getv() 
    {
        vector<int> w(10);
        w[0]=10;
        cout<<w.size()<<endl;
        return w;
    }
    
    const vector<int>& v = Getv(); //now all ok
    

    但我不推荐这种方式。它可能是未来错误的来源。 最好的方法是返回向量的值。

    vector<int> Getv() 
    {
       vector<int> w(10);
       w[0]=10;
       cout<<w.size()<<endl;
       return w;
    }
    
    vector<int>v = Getv();
    

    由于只有 1 个返回语句,您可以考虑 RVO,并且复制构造函数也不会被调用。它既快速又安全。

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2022-01-05
      • 2021-08-15
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多