2016-11-30 7 views
-1

このコードを見てください。ポイントを動的に割り当てられたポイントのダブルポインタがNULLかどうかを確認するにはどうすればいいですか?

#include <iostream> 
#include <list> 
using namespace std; 

void main() 
{ 
    list<int*> m_List; 
    int* i = new int(1); 
    m_List.push_back(i); 

    list<int**> m_pList; 
    m_pList.push_back(&m_List.front()); 

    list<int*>::iterator iter = m_List.begin(); 
    delete *iter; 
    *iter = NULL; 
    cout << *iter << endl; 
    cout << &*iter << endl; 
    iter = m_List.erase(iter); 

    list<int**>::iterator iter2 = m_pList.begin(); 
    cout << **iter2 << endl; 
    cout << *iter2 << endl; 
} 

結果:

00000000 
00A31A90 
DDDDDDDD 
00A31A90 

&*iter*iter2に等しいですが、*iter**iter2に等しいではありません。

なぜこれが起こるのか教えてください。どうすればこの問題を解決できますか?

+3

ここで、ポインタをすべてポインタにするコードを書く方法を学びましたか?この種の問題を抱える理由はほとんどありません。また、メインメソッドのシグネチャは正しくありません。常にintを返します。 –

+0

["using namespace std"は悪い習慣とみなされますか?](http://stackoverflow.com/q/1452721/995714)、[main'は 'int'を返すべきです](http://stackoverflow.com/q/204476/995714) –

答えて

0

あなたが削除したからです。

m_listから要素を削除すると、以前の& m_list.front()が無効になります。残っているのは未定義のゴミだけです。

消去しないでください。結果は期待どおりです。

しかし、ポインタとリストとイテレータを混在させるのは非常に鈍く奇妙なので、実際のコードを少しきれいにする方法があるかどうかを知りたいかもしれません。

1

m_List.erase(iter);を実行した後、m_Listは空で、**iter2は未定義です。
*iter2が存在しないm_Listの最初の要素のアドレス、である。)

それは、 『これは』何であるかは明らかではありませんので、 『この問題を解決』する方法を言うことは非常に難しいです。

関連する問題