-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;
}
'終わり() 'はリストの最後を過ぎたイテレータを返します。それは範囲外ですので、あなたの責任において参照してください。 – user4581301
最後に最後の1つを意味するのはいつですか?それは、リストがセンチネルで実装されているからですか? – Homunculus
良い質問です。良い答えはありません。私が知っている限り、それは単に 'nullptr'を保持しています。 'end'の信頼できるドキュメンテーションページはhttp://en.cppreference.com/w/cpp/container/list/endです。あなたがしているように見えるように 'back()'を使うことを考えてください。 – user4581301