在中,对于类PropertyDescriptor中的静态方法Accessor有一些重载声明。
这样的重载声明之一是这里。
template <typename Getter>
static PropertyDescriptor Accessor(Napi::Env env,
Napi::Object object,
const std::string& utf8name,
Getter getter,
napi_property_attributes attributes = napi_default,
void* data = nullptr);该声明需要对const std::string的引用
该声明的定义在中。
template <typename Getter>
inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env,
Napi::Object object,
const std::string& utf8name,
Getter getter,
napi_property_attributes attributes,
void* data) {
return Accessor(env, object, utf8name.c_str(), getter, attributes, data);
}如您所见,实现采用传递的.c_str()的std::string,因为实现实际上使用另一个重载,它需要一个const char*。
使用的重载也在中。
template <typename Getter>
inline PropertyDescriptor
PropertyDescriptor::Accessor(Napi::Env env,
Napi::Object object,
const char* utf8name,
Getter getter,
napi_property_attributes attributes,
void* data) {
using CbData = details::CallbackData<Getter, Napi::Value>;
auto callbackData = new CbData({ getter, data });
napi_status status = AttachData(env, object, callbackData);
if (status != napi_ok) {
delete callbackData;
NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor());
}
return PropertyDescriptor({
utf8name,
nullptr,
nullptr,
CbData::Wrapper,
nullptr,
nullptr,
attributes,
callbackData
});
}该实现使用Node-API,因为node-addon-api只是一个围绕Node-API的C++包装器。事实上,从const char* utf8name获得的.c_str()与一样被传递给构造函数,并存储在私有成员napi_property_descriptor _desc;中。
结论:每次使用Napi::PropertyDescriptor::Accessor传递一个std::string,然后将PD存储在一个向量中,或者仅仅使该字符串在PD仍然存在的情况下超出范围,就会触发一个未定义的行为!
示例:
Napi::Object TheNewObject = Napi::Object::New(env);
std::vector<Napi::PropertyDescriptor> vProps;
for (size_t index = 0; index < 2; ++index ) {
std::string strName("MyName_");
strName += std::to_string(index);
auto PD = Napi::PropertyDescriptor::Accessor(env, TheNewObject, strName, Caller);
vProps.push_back(PD);
} 12天前,我开了一期这里,但一无所获。
编辑:在阅读评论后,我应该补充如下:
napi_property_descriptor是一个简单的C结构。napi_define_properties。发布于 2022-02-11 16:46:35
PropertyDescriptor的当前实现确实存在一个问题。请参阅https://github.com/nodejs/node-addon-api/issues/1127#issuecomment-1036394322
很高兴我没有完全精神错乱。
https://stackoverflow.com/questions/70942530
复制相似问题