0

私のプロジェクトには次の2つの機能がありました。

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

私はそれらを次のように変換しました:

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);

体を

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());
}

そして、それらのすべての使用法は(&*V8StringToChar(whatever)).

そして、それは完璧に構築されます。

そして、それは実行時エラーを引き起こしています。

これが失敗する可能性がある場合はありますか?良い解決策を提供してください。

4

1 に答える 1

5

それ以外の

(&*V8StringToChar(whatever))

あなたは書くことができた:

V8StringToChar(whatever).get()

しかし、どちらもおそらく間違っており、状況によっては失敗することが保証されています。

これを行うと、新しいバッファが作成され、それが として返され、shared_ptrバッファのアドレスが取得されます。その後、shared_ptrが範囲外になり、バッファが削除され、ダングリング ポインタが残ります。そのアドレスのメモリにアクセスしようとすると、未定義の動作になります。刑務所に行く、直接刑務所に行く、通り過ぎない、200 ポンドを集めない。

std::unique_ptr<char[]>配列のサポートが組み込まれているため、関数が代わりに a を返すようにします。

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
于 2013-09-05T11:18:00.147 に答える