簡體   English   中英

從原始指針到std :: shared_ptr

[英]From raw pointers to std::shared_ptr

我在項目中具有以下兩個功能:

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

而且它完美地構建。

這會導致運行時錯誤。

有沒有可能失敗的情況,請提供一些好的解決方案?

代替

(&*V8StringToChar(whatever))

您可能已經寫過:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM