main: /usr/include/boost/smart_ptr/shared_ptr.hpp:734: typename boost::detail::sp_member_access::type boost::shared_ptr::operator->() const [with T = ProcessingMsg; typename boost::detail::sp_member_access::type = ProcessingMsg*]: Assertion `px != 0' failed.
중지됨 (core dumped)
std::map의 second 인자로 shared_ptr변수를 넣어주었는데 참조시 잘못된값에 접근하며 에러가 발생했습니다.
위의 에러를 간단한 코드로 다시 발생시켜 보았습니다.
#include <map>
#include <iostream>
#include <iterator>
using namespace std;
int main() {
map<int, char> v{{1, 'a'}, {2, 'b'}, {3, 'c'}};
map<int, char>::iterator iter = v.begin();
map<int, char>::iterator end = v.end();
while (iter != end) {
cout << "print: " << endl;
cout << iter->first << endl;
cout << iter->second << endl;
v.erase(iter);
iter++;
cout << iter->first << endl;
cout << iter->second << endl;
}
return 0;
}
map은 tree구조로 되어있으며 노드를 삭제시 배열처럼 삭제된 위치에 해당 노드가 들어가는 것이 아닌 부모 노드와 자식노드 혹은 삼촌 노드를 재연결하여 트리를 재구성합니다. 만약 위처럼 삭제하고 해당 iterator를 이동시키면 이미 삭제된 노드의 iterator를 조작하게 되므로 위와같은 에러가 발생하게 됩니다.
v.erase(iter++);
//iter++;
이런식으로 코드를 구성하게되면 노드를 삭제하더라도 iterator의값을 증감연산자 내부에서 보존하여 값을 이동시키므로 원하는동작을 수행할 수 있습니다.