2013-09-05 2 views
0

내가 가지고 내 프로젝트에서 이러한 두 가지 기능 : 나는 그들을 변환이 성병 :: shared_ptr의

char* V8StringToChar(v8::Handle<v8::String> str); 
char* V8StringToChar(v8::Local<v8::Value> val); 

:

std::shared_ptr<char> V8StringToChar(Handle<String> str) { 
    int len = str->Utf8Length(); 
    char* buf = new char[len + 1]; 
    str->WriteUtf8(buf, len + 1); 
    return std::shared_ptr<char>(buf, ArrayDeleter<char>()); 
} 
std::shared_ptr<char> V8StringToChar(Local<Value> val) { 
    return V8StringToChar(val->ToString()); 
} 

로 몸

template <class T> 
class ArrayDeleter { 
public: 
    void operator() (T* d) const 
    { delete [] d; } 
}; 
std::shared_ptr<char> V8StringToChar(v8::Handle<v8::String> str); 
std::shared_ptr<char> V8StringToChar(v8::Local<v8::Value> val); 

그리고 모든 사용은 (&*V8StringToChar(whatever))입니다.

그리고 완벽하게 구축됩니다.

그리고 런타임 오류가 발생합니다.

실패 할 수있는 경우가 있습니까? 그리고 좋은 해결책을 제공해주십시오. 대신

(&*V8StringToChar(whatever)) 

+3

바이트 배열에 대해서는 을 사용하십시오. –

+2

표준은 이미 배열 삭제기를 제공하고 있습니다.'std :: default_delete '을 사용하십시오 (배열을 지정하기 위해'[]'문자에주의하십시오,'delete []'를 사용합니다) –

+1

아마도'& *'는 당신에게 raw 포인터는 배열을 삭제할 때 무효화 될 수 있습니다. 예를 들어, 포인터로 무엇이든 할 수 있기 전에 즉시 발생합니다. 정말 원시 포인터가 필요할 때만 그렇게하고 아무 것도 포인터를 유지하지 않도록주의해야합니다. –

답변

5

은 당신이 쓴 수 :

V8StringToChar(whatever).get() 

그러나 모두는 아마 잘못하고 어떤 상황에서 실패 보장한다.

이렇게하면 새 버퍼가 만들어지고 shared_ptr으로 반환되고 버퍼의 주소가 반환 된 다음 shared_ptr이 범위를 벗어나 버퍼가 삭제되어 매달린 포인터가 남습니다. 붐, 해당 주소에서 메모리에 액세스하려는 시도는 정의되지 않은 동작입니다. 감옥에 가거나, 감옥에 직접 가고,지나 가지 않거나, £ 200을 모으지 마십시오.

배열에 대한 기본 제공 지원 기능이 있기 때문에 함수가 std::unique_ptr<char[]>을 대신 반환합니다.

std::unique_ptr<char[]> V8StringToChar(Handle<String> str) { 
    int len = str->Utf8Length(); 
    std::unique_ptr<char[]> buf(new char[len + 1]); 
    str->WriteUtf8(buf.get(), len + 1); 
    return buf; 
} 
std::unique_ptr<char[]> V8StringToChar(Local<Value> val) { 
    return V8StringToChar(val->ToString()); 
} 

런타임 오류를 수정하려면 버퍼가 필요한만큼 스마트 포인터를 유지해야합니다.

std::unique_ptr<char[]> smartptr = V8StringToChar(whatever); 
char* ptr = smartptr.get()); 
doSomethingWithPtr(ptr); 
// now it's OK if `smartptr` goes out of scope 
+1

200 파운드를 가질 수 있습니까? –

+0

만약 내가 V8StringToChar (뭐든간에) .get()도 괜찮아 야지 도처에? 하지만 아직 작동하지 않습니다. –

+0

@Jonathan V8StringToChar (무엇이든) .get()이 맞습니까? –