2012-09-25 52 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