#include <list>
#include <iostream>
struct Foo
{
Foo(int a):m_a(a)
{}
~Foo()
{
std::cout << "Foo destructor" << std::endl;
}
int m_a;
};
int main()
{
std::list<Foo> a;
Foo b(10);
std::cout << &b << std::endl;
a.push_back(b);
Foo* c = &(*a.begin());
std::cout << c << std::endl;
a.erase(a.begin());
std::cout << a.size() << std::endl;
c->m_a = 20;
std::cout << c->m_a << std::endl;
std::cout << b.m_a << std::endl;
}
결과는 다음과 같습니다왜 지워진 목록의 개체 멤버 변수에 액세스 할 수 있습니까?
0x7fff9920ee70
0x1036020
Foo destructor
0
20
10
Foo destructor
내가 더 이상 타르 객체의 멤버 변수를 액세스 할 수 목록에서 개체를 삭제 한 후 나는 보통 생각합니다. 하지만 위의 경우 c->m_a
에 액세스 할 수 있습니다. 객체를 지우고 난 후 c
이 가리키는 이유는 무엇입니까?
* 정의되지 않은 동작 *을 검색하고 읽으십시오. –
포인터가 여전히 메모리를 가리키고 객체의 구조를 알고 있고 실제로 소멸자가 메모리를 덮어 쓸 수 있다고 생각하기 때문에 상상할 수 있습니다. 그러나 아직 발생하지 않았습니다. – wrossmck
[이 답변] (http : //stackoverflow.com/a/6445794/1782465). – Angew