here과 같이 C++로 동적으로 라이브러리를로드합니다. 내 서재 지금 Derived
boost :: 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));
}
및 create
및 destroy
기능
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);
을 이제 내 문제 : 목록이 라이브러리가 채워지면 라이브러리의 new
는 AnotherObject
의를 만들라고합니다. 반면 목록이 삭제되면 클라이언트의 delete
이 AnotherObject
을 파괴하기 위해 호출됩니다. 이 문제를 피하려면 어떻게해야합니까?
이라고 부를 수는 없습니다. 플러그인 시스템의 일부입니다. 모든 라이브러리에는 새로운/삭제가있을 것입니다. 게다가 모든 AnotherObject를 수집하고 싶습니다. 따라서 클라이언트 목록은 모두 삭제해야합니다 ... – phlipsy
2 단계를 수행 할 필요가 없습니다. 단지'shared_ptr'을 사용하십시오. "마술처럼"어떤 호출을 할지를 안다. –
하나만 있어야합니다. deleter exe에서 클라이언트 dll은 메모리가 삭제되는 방법을 알 수 없습니다. 아이디어는 기본 exe 안에 모든 객체를 생성하고 shared_ptr의 deleter로 exe의 cpp lib에서 delete를 호출하는 함수를 전달하는 것입니다. – rpg