문제

shared_ptr의 주기적 참조를 찾기위한 팁/요령이 있습니까?

이것은 내가 찾으려고하는 것에 대한 엑스 맵입니다. 불행히도 나는 내 코드에서 루프를 찾을 수없는 것 같습니다.

struct A
{
  boost::shared_ptr<C> anC;
};

struct B
{
  boost::shared_ptr<A> anA;
};

struct C
{
  boost::shared_ptr<B> anB;
};
도움이 되었습니까?

해결책 4

위의 게시물의 조합을 사용했습니다. 나는 메모리 프로파일 러를 사용했고, 의심되는주기를 생각해 내고 약한주기를 사용하여 파산했습니다.

나는 이전에 내장 CRT 메모리 누출 감지를 사용했지만 불행히도 CRT 검출기 수명주기 후에 믿는 모듈 언로드까지 거래되지 않는 여러 정적 싱글 톤이 있습니다. 기본적으로 그것은 잘못된 긍정적 인 많은 Spew를 제공합니다.

다른 팁

사용하는 것이 좋습니다 Valgrind. 프로세스를 종료하면 모든 유출 된 메모리가 표시됩니다. 셧다운이 어떻게 든주기를 끊지 않는 한, 모든주기는 누출 된 메모리로 표시되어야하며, Valgrind는 코드에서 메모리가 원래 할당 된 위치를 알려줍니다.

나는 신용 위험 시스템의 설계를 한 번 (C ++에서는 관련이 없지만)를 담당했습니다. 이러한 것들은 노드에 할당 된 위험이있는 큰 그래프입니다. 우리는 사이클에 있는지 찾기 위해 간단한 휴리스틱을 가졌습니다. 우리가 500 번 이상 가로 지르면 (정확한 그림을 잊어 버렸다면 - 구성 가능) 대답은 예였습니다. 대부분의 사이클 탐지 체계는 이와 같은 휴리스틱에 의존합니다.

나는 과거에 비슷한 문제가있었습니다. Shared_PTR 주기적 참조로 인해 메모리 누출이 몇 달 동안 감지되지 않았습니다.

"캐시"를 조심하십시오. 항목 ( "위젯")을 처리 한 객체 ( "Factory")가 있습니다. 위젯은 a) 불변의 재산을 가지고 있었고 b) shared_ptr<Factory> 제작자에게 (때로는 다른 위젯 등을 만들었습니다). 공장에 위젯 캐시를 추가 할 때까지 모든 것이 잘 작동했습니다. 위젯은 불변이 아니기 때문에 요청 될 때마다 동일한 위젯을 백업하는 것이 좋습니다. 내 캐시는 캐시였습니다 shared_ptr<Widget>, 즉시 침묵하는 새는. 수정 사항은 분명하므로 들어 가지 않을 것입니다.

궁극적으로 나는 CRT에서 그러한 메모리 누출을 감지하기 위해 내가 사용했던 플랫폼에 의지 할 수있었습니다. Visual Studio의 CRT는 메모리 유출 감지 및보고가있어 테스트 프로그램에서 회귀를 방지하기 위해 활성화했습니다.

int main()
{
    // code code code
    // code code code

#ifdef _MSC_VER
    _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
    _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );
    _CrtDumpMemoryLeaks();
#endif
}

GCC는 아마도 비슷한 기본 누출보고를 가지고 있지만 그것이 무엇인지 모르겠습니다.

가장 간단한 대답은 스마트 포인터가 당신을 위해 할 수있는 것이 너무 많다는 것입니다.

나는 당신이 언제라도 녹음하는 것이 좋습니다 만들다 루프, (한 번에 세 객체를 모두 만들면 쉬운 경우, 그렇지 않으면 더 까다 롭습니다 ...). 그런 다음 객체를 삭제 / 해제하는 위치를 확인하십시오.

이 객체가 소유 한 Shared_ptrs 목록을 반환하는 일종의 디버깅 인터페이스를 구현할 수 있습니다. shared_ptr에 저장된 모든 클래스에 대해이 작업을 수행해야합니다. 이제 횡단 할 수있는 일반적인 그래프가 있으며 사이클 감지 알고리즘을 사용할 수 있습니다. 나는 믿는다 Tarjan의 강력하게 연결된 구성 요소 알고리즘 이것에 효과가있을 수 있지만 그래프 이론은 나의 요새가 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top