2012-09-25 48 views
1

我刚刚在代码中注意到我在堆栈中声明了一个向量(而不是堆),然后使用我的“set”函数将另一个类的成员变量设置为此向量。唯一的问题是在退出我的函数(myFunction)之后,矢量应该被销毁(因为它在堆栈上)并且对这个矢量的引用应该指向“没有意义”。但我的代码工作正常,所以我问自己为什么。我真的很幸运,因为这个向量所在的内存部分是存在的,因为到现在为止没有人删除它?所以如果我的代码没有崩溃,这是一个幸运的问题? 下面是代码:在堆或堆栈上的C++矢量?

void myFunction() { 
    std::vector<std::vector<double>> vDoubleVector = MyUtils::CreateDoubleVector(); //Creates a 
    double vector (but not on heap) 

    MyClass mC; 
    mC.SetDoubleVector(vDoubleVector); 
} 

class MyClass { 
    std::vector<std::vector<double>> mDoubleVector; 
    void SetDoubleVector(std::vector<std::vector<double>>& aDoubleVector) { 
    mDoubleVector = aDoubleVector; 
    } 
} 
+0

对于你提到发生的情况,'mDoubleVector'需要是一个引用成员,它不在你的代码中。而且,如果它是一个引用成员,你不能使用setter函数设置它,需要在构造函数成员初始化列表中初始化它。你拥有的是'double'类型的成员,它有自己的内存。 –

回答

3

由于Luchian比我快,我要懂事改善添加以下代码:

void SetDoubleVector(std::vector<std::vector<double>> aDoubleVector) { 
    mDoubleVector = std::move(aDoubleVector); 
    } 

援引“经验法则” - 如果你需要复制,这样做的接口。

//编辑完成答案。

您的代码没有复制该载体通过使用它的operator=SetDoubleVector

+0

或者你可以声明mDoubleVector作为参考,然后赋值运算符只复制地址。但是,当然我需要动态地声明矢量 – ISTB

+0

这是一个强大的指责...... +1 –

+1

它不会是一个引用 - 引用不能只是在空间中“挂起” - 它们必须从开始。 –

3

有到vector没有提及,班里有一个复制它

+0

但我通过引用传递它。或者你的意思是分配mDoubleVector = aDoubleVector;做一个副本 – ISTB

+0

是的,正是这个^ –

+0

是的,当然,我错过了这个细节。谢谢 – ISTB