2016-10-12 61 views
1

我碰到這個評論是在另一個SO後,關於一個std容器放置引用:用的std ::容器,儲存引用GNU C++ 98

它在C++語言的一個缺陷。您無法獲取 引用的地址,因爲嘗試這樣做會導致引用該對象的地址爲 ,因此您永遠無法獲得指向 的引用。 std :: vector使用指向其元素的指針,因此需要能夠指向被存儲的 值。您必須改爲使用指針 。

的職位:

Why can't I make a vector of references?

假設這是正確的,有人可以解釋爲什麼我下面的代碼工作?我並不是想暗示這個人是錯的,我只是想確保我明白什麼是可能的,哪些不是。

我的代碼:

#include <iostream> 
#include <vector> 
#include "stdio.h" 

struct TestStruct 
{ 
    int x; 
    int y; 
}; 

class TestClass { 
public: 
TestClass(int x, int y); 
int getX(); 
int getY(); 
private: 
int mX; 
int mY; 
}; 

TestClass::TestClass(int x, int y) 
{ 
    mX = x; 
    mY = y; 
} 

int TestClass::getX() 
{ 
    return mX; 
} 

int TestClass::getY() 
{ 
    return mY; 
} 


int main() 
{ 
    // test struct 
    std::vector<TestStruct> structVec; 

    TestStruct testStruct; 
    testStruct.x = 10; 
    testStruct.y = 100; 
    structVec.push_back(testStruct); 
    testStruct.x = 2; 
    testStruct.y = 200; 
    structVec.push_back(testStruct); 
    testStruct.x = 3; 
    testStruct.y = 300; 
    structVec.push_back(testStruct); 

    for (int i = 0; i < structVec.size(); i++) 
    { 
     printf("testStruct [%d] - [x: %d, y: %d] \n", i, structVec[i].x, structVec[i].y); 
    } 

    // test object 
    std::vector<TestClass> objVec; 

    objVec.push_back(*new TestClass(10, 100)); 
    objVec.push_back(*new TestClass(20, 200)); 
    objVec.push_back(*new TestClass(30, 300)); 
    for (int i = 0; i < objVec.size(); i++) 
    { 
     printf("objVec [%d] - [x: %d, y: %d] \n", i, objVec[i].getX(), objVec[i].getY()); 
    } 
} 

輸出:

testStruct [0] - [x: 10, y: 100] 
testStruct [1] - [x: 2, y: 200] 
testStruct [2] - [x: 3, y: 300] 
objVec [0] - [x: 10, y: 100] 
objVec [1] - [x: 20, y: 200] 
objVec [2] - [x: 30, y: 300] 
+3

你的代碼中沒有引用的向量你有內存泄漏otoh – krzaq

+0

由於引用部分地說「std :: vector使用指向其元素的指針」,這是無稽之談,我不會注意其他任何東西, –

回答

1

當你寫這樣的代碼:

objVec.push_back(*new TestClass(10, 100)); 

要創建的一個new實例,然後使用*對其進行解引用,然後在調用push_back時將其複製到矢量中。

但你泄漏TestClass對象在堆上用new分配。

您可能需要使用vector<shared_ptr<TestClass>>vector<unique_ptr<TestClass>>,而是如果你想存儲的,而不是TestClass實例指針(智能指針)(你確定嗎?)。

請注意,引用的向量將是vector<TestClass&>,這是錯誤的。

P.S.正如你在標題中引用了C++ 98「,你不能有unique_ptr,因爲它需要C++ 11的移動語義shared_ptr成爲C++ 11的標準;你仍然可以在C++ 98中使用boost::shared_ptr

+0

謝謝!你的第一句話爲我清除了一些東西,爲了確保我理解正確,在我的上面的代碼中,我將在堆上有3個TestClass對象,那些相同的3個TestClass對象也在堆棧中的objVec中,是否正確? – Hoofamon

+0

三個在堆上泄露,三個安全地存儲在std :: vector中。 –