this question을 실험하면서 나는 완전히 이해하지 못하는 예를 만들었습니다. 특히 포인터, 참조 및 boost :: shared_ptr에 대한 나의 오해를 강조합니다. 이 코드를 실행boost :: shared_ptr 질문. 왜이게 효과가 있니?
int& r = *(new int(0));//gratuitous pointer leak, got to initialize it to something
{
boost::shared_ptr<int> sp(new int(100));
r = *sp;
cout << "r=" << r << endl;
}
cout << "r=" << r << endl << endl;
int* p;
{
boost::shared_ptr<int> sp(new int(100));
p = &*sp;
cout << "*p=" << *p << endl;
}
cout << "*p=" << *p << endl;
이 같은 출력 뭔가를 제공합니다
r=100
r=100
*p=100
*p=13
왜 기준이있는 shared_ptr의 죽음을 생존 않습니다를하지만 포인터하지 않습니다? 여기에있는 답변에 문제가있다
두 정반대과 모순 솔루션과 진실이되는 합의가있을 것 같다. shared_ptr이 삭제 된 후 참조를 사용할 수있는 기능이 좋겠지 만 무효 한 경우이 사실을 이해해야합니다.
누군가가 참조에서 정의되지 않은 동작을 나타내는 간단한 예제를 게시 할 수 있습니다.
블록 순서가 바뀌면 참조가 존속하고 포인터는 그렇지 않습니다. 그러나 이것은 단지 행운이라는 말을하는 거지? – JnBrymn
내 의견이 잘못되었습니다. @ FredOverflow의 대답을 참조하십시오. 죄송합니다 ... –
'* (new ...)'을 쓰지 마십시오. 결과적으로 "힙에서 일부 메모리를 할당 한 다음 힙에서 메모리가 유실되었음을 잊어 버리십시오"라고 말하고있는 것입니다. 그런 다음 참조가 아닌 값에 할당하면 복구 할 수없는 메모리 누출이 발생합니다. 참조로 지정해도 정리에는'delete & r'이 필요합니다. 이것은 끔찍한 비 관례입니다. –