2014-06-13 2 views
0

기본적으로 Bison은 공용체를 사용하여 의미 유형 값을 저장합니다. 노조는 포인터, 프리미티브, 배열 및 일반 오래된 데이터 이외의 필드를 지원하지 않기 때문에 shared_ptrs에 대한 원시 포인터로 끝났으므로 수동으로 자유롭게해야합니다.들소의 메모리 관리 향상

작동하는 동안 오류가 발생하기 쉽습니다. 나는 그것을 더 나은 것으로 대체하고 싶습니다. HereYYSTYPE 매크로를 사용하여 유니온을 대체 할 내 자신의 의미 유형을 제공 할 수 있다고 제안합니다. 그러나 제안 된 교체는 나에게 너무 장황하게 보인다.

더 안전한 바이슨 파서를 작성하는 데 도움이되는 몇 가지 예시 또는 참조 페이지 또는 다른 제안이 있습니까? 다른 파서 생성기로 전환하는 것을 고려하지 않습니다.

+0

실제로 C++ 11에서는'union'에 저장 될 클래스에 대한 요구 사항이 꽤 완화되었습니다. –

+0

'shared_ptr'유형의 필드를 갖기에 충분합니까? 커스텀 생성자를 가진 어떤 것도 컴파일 에러를 일으킬 것이라고 확신했습니다. –

+0

저는 이제 사용자 지정 생성자가 허용되지만, IIRC에는 몇 가지 제한이 있습니다. 표준을 확인해야합니다. –

답변

2

제가 사용했던 기술 중 하나는 #define YYSTYPE std::shared_ptr<Object>입니다. 여기에서 Object은 가상 소멸자가있는 추상 기본 클래스이고 모든 가상 함수가 객체의 다양한 하위 클래스에 필요한 모든 작업을 수행합니다. 파생 된 클래스 포인터에 대한 오브젝트 포인터를 효과적으로 다운 캐스팅 할 때 다소 "심한 코드 냄새"가납니다.

그냥 원시 포인터를 사용하고 올바르게 정리하는 것이 그리 어렵지는 않습니다 - 모든 동작은 명시 적으로 delete를 호출하거나 복사하여 직접 사용하는 규칙에 따라 할당 된 모든 포인터를 정리해야합니다. $$으로) 소유하고 있지만 액션이 일반적으로 작기 때문에 (대부분 다른 기능을 호출 함) 너무 어렵지 않습니다. 그런 다음 오류가 발생한 후에 삭제 된 항목에 대한 올바른 정리를 보장하기 위해 선언문을 %destructor으로 사용하기 만하면됩니다.

+0

실제로 다른 접근법은 지금 제가 작성한 코드입니다. 내가 말할 수있는 한 메모리 누수가 없다. ('valgrind'), 모든'delete's에 대해 불안하다. 그 추상적 인 클래스 접근법을 시도해 봅니다 - 객체를 원래의 위치로 다시 캐스팅하는 데 꽤 좋은 해결책이 있다면 그것은 완벽 할 것입니다! –