문제

우리는 여러 다른 고객에게 제공하는 C ++ 라이브러리가 있습니다. 최근에 우리는 공개 인터페이스에서 원시 포인터를 사용하여 Boost :: sharedptr을 사용하여 스위치를 만들었습니다. 이것은 이제 고객이 더 이상 누가 무엇을 삭제 해야하는지 걱정할 필요가 없다는 점에서 엄청난 이익을 제공했습니다. 우리가 스위치를 만들었을 때 나는 그것이 옳은 일이라고 믿었지만, 우리가 공개 인터페이스에 타사 라이브러리에서 무언가를 포함시켜야한다는 것을 괴롭 혔습니다. 일반적으로 가능하다면 그런 종류의 일을 피합니다. 나는 부스트가 실제로 C ++ 언어의 일부 였다는 것을 합리화했으며, 우리의 유스 케이스는 클라이언트 코드와 라이브러리가 객체에 포인터를 보유해야합니다. 그러나 최근에 우리의 고객 중 한 명이 인터페이스에서 중립 스마트 포인터 클래스를 사용할 수 있는지 물어 보았습니다. 우리의 라이브러리는 본질적으로 내가 확실히 이해하고 감사하는 지점의 특정 버전으로 강요하기 때문입니다. 이제 나는 최고의 행동 과정이 무엇인지 궁금합니다. 나는 그것에 대해 조금 생각했고, 단순히 Boost Smart Pointer를 개최하는 간단한 스마트 포인터 클래스를 만드는 것에 대해 궁금해했습니다. 그러나 고객은 아마도 그 사람들 중 하나를 Boost의 풍미에 즉시 바로 채우고 Sharedptr의 풍미를 즉시 할 것입니다. 그리고 우리는 세 가지 공유 포인터가 될 것입니다. 문제가 될 수도 있습니다. 그렇지 않을 수도 있습니다. 어쨌든, 나는이 문제를 해결하는 가장 좋은 방법에 대한 커뮤니티의 의견을 듣고 싶습니다.

편집 : 원래 소유권을 이전했다고 말했지만 API 경계의 양쪽에 해당 코드가 객체에 대한 포인터를 보유해야한다고 지정해야했습니다.

도움이 되었습니까?

해결책

shared_ptr <> ~이다 TR1의 출시 시점에서 언어의 일부. 보다: (TR1)

다른 팁

가능한 해결책 중 하나는 프로젝트와 함께 Boost :: Shared_ptr을 배송하는 것입니다. 모두 헤더로 구성되므로 고객이 부스트 라이브러리를 수동으로 설치하지 않아도됩니다. 당신이 사용할 수있는 BCP 라이브러리 자체를 포함하여 특정 부스트 라이브러리에서 필요한 모든 파일을 얻으려면 나는 그 당시 회사에서 일했고 필요했을 때 그렇게했습니다. boost::shared_ptr 그리고 실제로는 크게 효과가있었습니다.

의미론이 실제로 있다면 소유권 양도, 표준 C ++이므로 Auto_Ptr을 사용하지 않는 이유는 무엇입니까? 내부적으로 Auto_ptr에서 Shared_ptr을 여전히 구성한 다음 필요한 경우 소유권을 공유 할 수 있습니다.

우선, 라이브러리를 컴파일 된 라이브러리가 아닌 소스 코드로 배포하면이 답변을 무시할 수 있습니다. 다른 플랫폼과 관련이없는 Windows 특정 문제도 있습니다.

개인적으로 라이브러리의 공개 인터페이스에 너무 많은 펑키 한 C ++가 고객에게 많은 문제를 일으킬 수 있기 때문에 너무 많은 C ++를 피해야한다고 생각합니다.

이것이 당신의 특정 예에 얼마나 적용되는지 잘 모르겠지만, 새 버전으로 업그레이드했을 때 STL 라이브러리의 기호가 제 3 자 라이브러리의 상징과 충돌 한 문제를 개인적으로 수행합니다. 이것은 우리가 이상한 장소에서 충돌을 일으켰고 문제를 피하기 위해 많은 트릭을해야했습니다. 결국 나는 이것 때문에 오래된 버전의 도서관에 머물 렀습니다.

당신이 실행할 수있는 또 다른 문제는 다른 C ++ 컴파일러가 동일한 기호를 다르게 만들 수 있다는 것입니다. 즉, 동일한 부스트 버전을 사용하더라도 지원하려는 모든 컴파일러에 별도의 라이브러리를 제공해야한다는 것입니다. 이것에 대한 논의는 "불완전한 C ++"책을 확인하십시오.

다른 C ++ 컴파일러 및 환경의 현재 세계에서 슬픈 사실은 인터페이스에 C를 제외한 것을 피하고 라이브러리를 동적으로 연결해야한다고 생각합니다 (고객을 연결할 때 충돌을 피하기 위해 Windows 런타임 라이브러리를 연결할 때 충돌을 피하십시오. 여기서 진짜 고통이 될 수 있습니다). 모든 기호가 DLL의 고객 환경에서 격리되므로 원하는만큼 부스트와 멋진 C ++를 사용할 수 있습니다.

라이브러리의 인터페이스에 스마트 포인터 및 기타 멋진 C ++ 기능을 원한다면 소스 코드를 배포하는 편의 계층을 구축하십시오. 이렇게하면 항상 고객 환경에서 컴파일됩니다. 이 인터페이스는 노출 된 C 함수를 영리한 방식으로 호출합니다. 고객이 원하지 않더라도 고객이이를 채택해야하므로 해당 레이어에서 부스트를 사용하는 것이 좋은 생각은 아니지만 해당 레이어가 소스로 배포되기 때문에 교체하거나 다른 솔루션을 찾기가 쉽습니다. 암호.

또 다른 좋은 기능은 일반적으로 C/C ++보다 다른 언어에 라이브러리를 노출하려면 이상한 이름 Mangling을 가진 C ++ 기능보다 DLL에서 C 기능을 호출하는 것이 일반적으로 더 쉽다는 것입니다.

이 접근법은 여러 가지면에서 당신의 삶을 더 복잡하게 만들지 만, 사람들이 자신의 코드와 성공적으로 연결할 수 없었기 때문에 사람들이 도서관을 피할 가능성이 줄어 듭니다.

이것은 C ++입니다. 공유 포인터 구현을 통해 인터페이스 클래스를 템플릿 할 수 있습니다.

이것은 내가 한동안 가지고 있었던 흥미로운 질문입니다. 사용자가 제공하는 라이브러리로 사용자를 강요하거나 프로젝트에서 가장 좋은 것이 무엇인지 결정하게합니까? 항상 그렇듯이 질문은 귀하가 제공하는 것과 사용자가 요구하는 것입니다.

원시 포인터를 사용하면 모든 종류의 가능성이 허용됩니다. 사용자 코드는 원시 포인터를 사용하여 std :: auto_ptr, shared_ptr (부스트 또는 tr1) 또는 홈 브루 버전의 스마트 포인터에 저장할 수 있습니다. 그러나 이것은 또한 메모리를 릴리스하는 것을 잊어 버리면 사용자에게 문제를 일으킬 수 있으며, 메소드 호출을 위해 임시 생성을 원한다면 (원시 포인터를 제공하는 경우, 그들은 저장해야합니다. 비 임유 [아마도 스마트 한] 포인터 변수의 포인터).

이제 스마트 포인터를 사용하면 솔루션을 사용자에게 강제로 강요합니다. 그들이 스마트 포인터의 자체 버전을 사용할 계획이라면 (부스트 :: shared_ptr을 사용하고 std :: tr1 :: shared_ptr을 원한다) 인터페이스와 함께 작동하는 경우 더 이상 사용할 수 없습니다. 스마트 포인터를 결정하는 스마트 포인터 (STD :: AUTO_PTR 이외의 특별한)는 솔루션을 강요 할뿐만 아니라 문제도 있습니다.

사용자가 멀티 스레드 애플리케이션이 있고 솔루션이 스레드 안전하지 않은 경우 사용자는 안전하지 않은 솔루션에 묶여 있습니다. 반면에 스마트 포인터가 스레드 안전이지만 잠금 비용을 불러 일으키는 경우 해당 비용은 멀티 스레드 애플리케이션에서 작동하더라도 사용자에게 추진됩니다. 스마트 포인터 라이브러리의 변경으로 인해 코드의 호환성을 중단하기 때문에 라이브러리를 컴파일하면 스마트 포인터뿐만 아니라 특정 버전도 강요하고 있습니다.

부수적으로 부스트 :: shared_ptr (boost 1.33+)는 다음과 같습니다. 스레드 안전합니다 대부분의 상황에서 많은 플랫폼에서 잠금 장치 구현을 사용합니다. 어쨌든 이것은 당신이 고려해야 할 것들에 대한 아이디어를 줄 것입니다.

마지막으로, 사용자를 스마트 포인터 유형을 사용하도록 묶을뿐만 아니라 동일한 버전을 사용하고 있음을 고려해야합니다. 특정 버전의 부스트에 대해 LIB를 컴파일하는 경우 사용자는 해당 특정 구현에 바인딩됩니다.

당신은 사용할 수 있습니다 사본 부스트 스마트 포인터 클래스 만있는 Boost의 사용자 정의 버전을 구축하는 유틸리티. Smart Pointer 클래스는 헤더 전용 라이브러리이므로 라이브러리에 포함시킬 수있는 몇 가지 헤더가 발생해야합니다.

Boost :: shared_ptr 소개는 고객이 Boost를 사용하도록 강요합니다. 어떤 사람들에게는 이것이 사소한 문제입니다.

또한 LIB가 컴파일 된 바이너리로 분배 된 경우 고객이 LIB에서 사용하는 것과 동일한 컴파일러를 사용하도록 강요합니다. 또는 라이브러리가 소스 코드에 배포되면 클라이언트는 LIB를 컴파일하는 데 사용되는 고유 한 컴파일러를 고수해야합니다. 이것은 상당한 크기의 프로젝트에 대한 사소한 문제가 아닙니다.

사용 auto_ptr 또는 C 인터페이스를 고수하십시오. 인터페이스에 C ++ libs를 강제하는 것은 항상 추악하고, 크로스 플랫폼이 될 가능성을 없애고, 다른 "다운 스트림"구성을 가진 고객에게 유지 보수 악몽을 일으 킵니다.

C ++ 0X가 고객에게 주류가 되 자마자 std::shared_ptr.

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