2009-07-15 2 views
1

here과 같이 C++로 동적으로 라이브러리를로드합니다. 내 서재 지금 Derivedboost :: ptr_list를 라이브러리에서 클라이언트로 전송

class Derived : public Base { ... }; 

void Derived::get_list(boost::ptr_list<AnotherObject& list) const { 
    list.push_back(new AnotherObject(1)); 
    list.push_back(new AnotherObject(2)); 
} 

createdestroy 기능

extern "C" { 
    Base* create() { new Derived; } 
    destroy(Base* p) { delete p; } 
} 

내 클라이언트 프로그램을 파생 클래스를 제공

#include <boost/ptr_container/ptr_list.hpp> 
class Base { 
public: 
    virtual void get_list(boost::ptr_list<AnotherObject>& list) const = 0; 
}; 

그리고 :

내 추상 기본 클래스는 다음과 같습니다 라이브러리와 두 개의 012를로드합니다.및 destroy 기능 그런 다음 Derived의 인스턴스를 생성하고 사용

Base* obj = create(); 
boost::ptr_list<AnotherObject> list; 
obj->get_list(list); 

을 이제 내 문제 : 목록이 라이브러리가 채워지면 라이브러리의 newAnotherObject의를 만들라고합니다. 반면 목록이 삭제되면 클라이언트의 deleteAnotherObject을 파괴하기 위해 호출됩니다. 이 문제를 피하려면 어떻게해야합니까?

답변

3
  1. std::list<shared_ptr<AnotherObject> >을 사용하십시오.
  2. 적절한 삭제를 호출하는 shared_ptr에 사용자 정의 삭제자를 전달하십시오.
+0

이라고 부를 수는 없습니다. 플러그인 시스템의 일부입니다. 모든 라이브러리에는 새로운/삭제가있을 것입니다. 게다가 모든 AnotherObject를 수집하고 싶습니다. 따라서 클라이언트 목록은 모두 삭제해야합니다 ... – phlipsy

+0

2 단계를 수행 할 필요가 없습니다. 단지'shared_ptr'을 사용하십시오. "마술처럼"어떤 호출을 할지를 안다. –

+0

하나만 있어야합니다. deleter exe에서 클라이언트 dll은 메모리가 삭제되는 방법을 알 수 없습니다. 아이디어는 기본 exe 안에 모든 객체를 생성하고 shared_ptr의 deleter로 exe의 cpp lib에서 delete를 호출하는 함수를 전달하는 것입니다. – rpg

0

쉬운 대답은 응용 프로그램과 라이브러리 모두 동일한 버전의 컴파일러로 컴파일된다는 것입니다.이 경우 둘 다 동일한 새/삭제 버전을 얻습니다.

+0

주 프로그램에서 new/delete 연산자를 바꾸었지만 라이브러리에서 가져 오지 않았다고 가정합니다. – AProgrammer

+0

글쎄, 그는 어디서나 말하지 않았다. –

+0

그것은 플러그인 시스템의 일부입니다. 따라서 다른 표준 라이브러리를 가진 다른 사람이 새 플러그인을 작성하면 충돌이 발생하지 않도록 보장해야합니다. – phlipsy

0

가장 좋은 방법은 전체 프로그램에 대해 하나의 연산자 new와 하나의 연산자 삭제를하는 것입니다. 도움이 될 수있는 링크 옵션이 있습니다 (나는 -Wl - export-dynamic이지만 다른 문제 일 수도 있음).

불가능할 경우 모든 삭제 작업이 새 작업을 수행하는 동일한 엔티티에 의해 수행되므로 인라인 함수에서 정의하지 마십시오.

관련 문제