2016-10-12 7 views
1

私はSTDコンテナに収納参照について、別のSOの記事でこのコメントに出くわした:それは、C++言語の欠陥だ保存参照GNU C++ 98

。 参照のアドレスを取得することはできません。その場合、参照するオブジェクトが のアドレスになり、参照先へのポインタが決して得られません。 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

あなたのコードに参照の 'vector'がありません。メモリリークがありました. – krzaq

+0

引用符は部分的に" std :: vectorはその要素へのポインタで動作します " –

答えて

1

あなたは、このようなコードを書く時:

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

をあなたがのnewインスタンスを作成していますヒープ上の、次に*を使用して逆参照しています。push_backを呼び出すと、ベクター内にコピーされます。

しかし、の元のTestClassオブジェクトがヒープ上でnewを使用して割り当てられています。

あなたが代わりにTestClassインスタンスのポインタ(スマートポインタ)を格納する場合(あなたが確信している?)の代わりにvector<shared_ptr<TestClass>>またはvector<unique_ptr<TestClass>>を使用することをお勧めします。

参考文献のベクトルはvector<TestClass&>であることに注意してください。これは間違っています。

P.S.タイトルでC++ 98 "を引用したので、unique_ptrにはC++ 11の移動セマンティクスが必要であるため、shared_ptrはC++ 11では標準となりましたが、boost::shared_ptrはC++ 98で引き続き使用できます。

+0

あなたの最初の文は私には分かりませんが、私の上記のコードでは、ヒープとコピーに3つのTestClassオブジェクトがあることを正しく理解しています。スタック上のobjVec内の同じ3つのTestClassオブジェクトのうち、正しいものは – Hoofamon

+0

3つはヒープ上でリークし、3つはstd :: vectorに安全に格納されています。 –

関連する問題