shared_ptr에는 완전한 유형이 필요합니다.lua_State*와 함께 사용할 수 없습니다.

StackOverflow https://stackoverflow.com/questions/2433667

  •  19-09-2019
  •  | 
  •  

문제

저는 Lua용 C++/OOP 래퍼를 작성 중입니다.내 코드는 다음과 같습니다

class LuaState
{
     boost::shared_ptr<lua_State> L;

     LuaState(): L( luaL_newstate(), LuaState::CustomDeleter )
     {
     }
}

문제는 lua_State가 불완전한 유형이고 shared_ptr 생성자에 완전한 유형이 필요하다는 것입니다.그리고 안전한 포인터 공유가 필요합니다.(재밌는 점은 부스트 ​​문서에서 대부분의 함수에는 완전한 유형이 필요하지 않지만 생성자는 필요하므로 사용할 방법이 없다고 말합니다. http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm)

이 문제를 해결할 수 있을까요?감사합니다.

도움이 되었습니까?

해결책

당신은 자신의 삭제자를 사용하고 있습니다. 이는 생성 시 완전한 유형을 가질 필요가 없음을 의미합니다.유일한 요구 사항은 CustomDeleter 그것을 처리할 수 있습니다.(예를 들어 전달된 포인터를 완전한 유형으로 변환할 수 있습니다. void* 에게 CompleteType*).

완전성의 배경은 일단 생성자가 shared_ptr 기본 삭제자로 호출되면 다음 행을 포함하는 클래스를 인스턴스화합니다. delete p; - 이 코드가 정확하려면 p 불완전해서는 안 됩니다.소멸자는 이 삭제자 코드를 간접적으로 호출하므로 유형의 완전성에 의존하지 않습니다.

그러나 자체 삭제자를 전달하는 경우 자체 삭제자의 요구 사항이 적용됩니다.반드시 정의하세요. CustomDeleter ~ 후에 lua_State 완성되었습니다.

다른 팁

그것은 이상하게 보였다 boost::shared_ptr 인스턴스화를 위해 완전한 유형이 필요하므로 반대를 보여주는이 작은 테스트 (끝에 코드)를 썼습니다.

나는 문제가 완료 해야하는 유형이 아니라 당신이 shared_ptr 생성자, 멤버 기능처럼 보입니다. 두 번째 논쟁은 단일 포인터 인수로 부를 수있는 것이어야합니다. 래퍼의 멤버 기능을 사용하려면 사용할 수 있습니다. boost::bind 인터페이스를 조정합니다.

아마도 당신은 의미합니까? :

 LuaState(): L( luaL_newstate(), boost::bind(LuaState::CustomDeleter,this,_1) )
 {
 }

그것을 시연합니다 boost::shared_ptr 완전한 유형이 필요하지 않습니다.

// forward declarations
struct test;
test * create();
void destroy(test *);

// wrapper equivalent to the one in the question
struct wrapper {
   boost::shared_ptr<test> sp;
   wrapper() : sp( create(), destroy ) {}
};

// actual definitions
struct test {};
test * create() { return new test; }
void destroy(test *t) { delete t; }

// make it executable
int main() {
   test t;
}

lua_state*를 복제 할 수 없다는 점을 감안할 때, 루스트 대상을 의미하는 것입니까? 그런 본질적으로 무의식 불가능한 대상을 복사 할 예정인 의미는 무엇입니까?

당신이 원하는 것처럼 보이는 행동은입니다 얕은 복사 - 그리고 그 일을하는 가장 좋은 방법은 Luastate가 Unpypyable이되어 Lua_state의 수명을 관리하는 것입니다. 그러면 주를 주변으로 통과 할 수 있습니다. shared_ptr<LuaState>.

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