我在我的项目这两个功能:从原始指针到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))
。
它完美地构建。
它导致运行时错误。
是否有任何情况下,这可能会失败并请提供一些很好的解决方案?
对于字节数组使用向量。 –
该标准已经提供了一个数组删除器,使用'std :: default_delete'(注意'[]'字符来指定一个数组,因此它使用'delete []') –
可能是因为'&*'给了你一个raw指针,当数组被删除时可以使其失效 - 在你的例子中,这是立即发生的,然后你可以用指针做任何事情。只有当你真的需要一个原始指针时才这样做,并且要非常小心地确保没有任何东西保持指针。 –