2012-01-21 3 views
2

私はmingwのコンパイラを使用して、Windows上のコードブロックから次のC++のコードを実行すると、すべてが大丈夫です上のコードブロックで動作します。私は期待して(とWindows上で取得)出力がエラー、しかし、窓

1 
1 

ある

void func (vector<int> &v1, vector<vector< int *> > &v2); 

int main() 
{ 
    vector<int> v1; 
    v1.push_back(0); 
    vector<vector <int *> > v2; 
    vector<int *> vTemp; 
    int x = 0; 
    int * ptr = &x; 
    vTemp.push_back(ptr); 
    v2.push_back(vTemp); 

    func(v1,v2); 
    cout<<*(v2[0][1])<<endl; 

    return 0; 
} 
void func (vector<int> &v1, vector<vector< int *> > &v2) 
{ 
    v1.push_back(1); 
    int *ptr = &(v1[1]); 
    v2[0].push_back(ptr); 
    cout<<*(v2[0][1])<<endl; 
    v1.push_back(2); 
    int *ptr2 = &(v1[2]); 
    v2[0].push_back(ptr2); 
    v1.push_back(3); 
    int *ptr3 = &(v1[3]); 
    v2[0].push_back(ptr3); 
} 

しかし、Mac上で、私は

を得る:しかし、私は、Mac OS上でそれを実行すると、それは動作しませんX
1 
0 

誰もがこれが起こってしなければならない理由を任意のアイデアを持っていますか?

答えて

3

プログラムが無効で、未定義の動作が表示されています。あなたのポインタの値は、vectorがサイズ変更された後に無効なベクトル要素のアドレスを保持します。

GuardMallocを有効にしてプログラムを実行すると、これがキャッチされます。

+1

この上に展開するために、プログラムの動作 'INT * PTR =&(V1 [1])'し、次いでそれがない 'v1.push_back(2)'。 'push_back'は、ベクトルの容量を増やす必要がある場合、ベクトルの要素を指すすべてのポインタを無効にします。 'v1'を作成した後、' main'に 'v1.reserve(4);'という行を追加すると、十分な容量が得られ、期待される答えが得られます。もちろん、これは非常に壊れやすいので、この方法でポインタを格納するのは悪い考えです。 – bames53

+0

@ bames53 +1素敵な展開 – justin

+0

クイックアンサー、ありがとうbames53明確にしてくれてありがとう。私は未定義の行動があるはずだと思ったが、どこから来たのか分からなかった。だからベクトルのオブジェクトへのポインタは悪い考えですよね? – Edlennion