2017-11-23 15 views
-3

これはあまりにも基本的である場合は申し訳ありません。しかし、私はなぜstd :: listからメソッド'end()' '' ''の戻り値が削除されたのか分かりません。イテレータ: '*'が要素の参照を返した場合、なぜdelete *(myList.end())がSegFaultを返すのですか

[怒鳴るコードの注:私は理由this postのこのアイデアに付属]

あなたは私が何を意味するか簡単に理解できるので、私の例をご確認ください。

#include <list> 
#include <memory> 

int main(int argc, char const *argv[]) 
{ 


    std::list<int*> myList; 
    int *ptr1 = new int(1) , *ptr2 = new int(2); 


    myList.push_back(ptr1); 
    myList.push_back(ptr2); 

    delete myList.back(); // !!<< this one is ok 

    //delete *(myList.end()); // !!<< but, this gives segmentation fault 
return 0; 
} 
+0

'終わり() 'はリストの最後を過ぎたイテレータを返します。それは範囲外ですので、あなたの責任において参照してください。 – user4581301

+0

最後に最後の1つを意味するのはいつですか?それは、リストがセンチネルで実装されているからですか? – Homunculus

+2

良い質問です。良い答えはありません。私が知っている限り、それは単に 'nullptr'を保持しています。 'end'の信頼できるドキュメンテーションページはhttp://en.cppreference.com/w/cpp/container/list/endです。あなたがしているように見えるように 'back()'を使うことを考えてください。 – user4581301

答えて

関連する問題