从原始指针到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());
}
以及它们对CCD_ 1的每次使用。
它的结构非常完美。
它会导致运行时错误。
有没有这种情况可能会失败?请提供一些好的解决方案?
而不是
(&*V8StringToChar(whatever))
你本可以写:
V8StringToChar(whatever).get()
但两者都可能是错误的,在某些情况下肯定会失败。
这样做会创建一个新的缓冲区,将其作为shared_ptr
返回,获取缓冲区的地址,然后shared_ptr
超出范围,缓冲区被删除,留下一个悬空指针。Boom,任何访问该地址内存的尝试都是未定义的行为。进监狱,直接进监狱,不通过,不收取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
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理