2017-05-18 17 views
0

현재 SWIG에서 .NET으로 빌드 된 라이브러리를 사용하고 있습니다. 이 라이브러리에 대한 문서는 생성 된 클래스가 폐기되어야하는지 또는 생성 된 클래스에 대한 정보를 제공하지 않습니다. 또한이 포럼의 소스에서 볼 수없는 자식 요소를 처리하기위한 코드를 추가해야한다는 다른 포럼에 대한 토론을 보았습니다. 이 모든 것의 맨 위에는 라이브러리의 샘플 프로젝트 및 테스트에 using이 포함되어 있지 않으며 만든 객체를 처리하지 않습니다.SWIG 생성 객체를 처리해야합니까?

'평균'SWIG 개체의 경우 처분해야합니까? 그들은 모두 기본 C++에서 객체를 삭제하는 기본 소멸자가있는 것 같습니다. 그렇다면 그냥 다른 객체로 취급하고 가비지 컬렉터에서 처리 할 수 ​​있습니까 (순환 참조 및 기타 고전적인 메모리 누수와 같이 가비지 컬렉터가 올바르게 처리하지 못하는 것을 제외하면). 어떤 종류의 처분 컨텍스트 또는 무엇인가로이 라이브러리에 모든 호출/오브젝트를 랩핑해야합니다.

+1

원형 참조로 인해 개체가 처리되지 않습니다. – Servy

+0

SWIG가 finalizer를 C# 개체에 추가 했습니까? GC가 모든 경우에 Dispose가 호출되는 것을 보장하지는 않기 때문에 아마도 메모리 누수가 발생합니다. –

+0

SWIG가 랩퍼 작성에 사용 된 방법에 따라 다 (니다. 수동으로 처분해야하는 오브젝트를 래핑하는 데는 많은 가능성이 있습니다[email protected]가 설명하는 것과 동시에 wrapper는 생성 된 코드가 finalizer를 포함하여 올바른 gc를 보장하도록 만들 수 있습니다. –

답변

0

의견에 대한 답변을 볼 때 내 경우에는 전반적으로 필요하지 않은 것으로 보입니다. SWIG는 dispose 함수를 호출하는 적절한 finalizer를 생성했습니다. dispose 함수가 SWIG 정의에 부적절하게 정의되어있을 수도 있지만,이 경우 수동으로 처분하면 어쨌든 도움이되지 않습니다.

편집 : 개체를 처분한다는 초기 주장은 필요하지 않지만 유용 할 수 있습니다.

은 SWIG를 통해 노출 된 컬렉션 개체가있는 경우를 생각해 Collection 또한 컬렉션에 의해 소유 '항목을'개체가 있습니다 Collection collection = new Collection(1, 2, 3); Item item = collection.Get(1); // c is now available for collection, as there are no longer any P/invokes nor references to it item.GetValue(); // Can possibly throw AccessViolationException if collection has been collected // based on how it cleans up its items.

: Item

이 작업을 수행하는 경우

이 문제가 발생하지 않도록하려면 collection까지 이후에 완료되거나 폐기되지 않도록해야합니다. 모두 item을 사용하고 있습니다. 이 작업은 몇 가지 방법으로 수행 할 수 있습니다

  • item의의 모든 용도의 끝에서 GC.KeepAlive()을 활용합니다. 예 :

    item.GetValue();

    GC.KeepAlive(collection);

  • 는 부모 객체의 결정 처리를 보장하기 위해 IDisposable 패턴을 활용합니다. 예 :

using(Collection collection = new Collection(1, 2, 3)) { Item item = collection.Get(1); item.GetValue(); }

그래서 수동 처리 또는 IDisposable 패턴을 사용하지 자체 필요이지만, 관리되지 않는 객체의 사용이 안전하고 일관하고 명확 있는지 확인하는 것이 유용 할 수 있습니다.