首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“”中的一些api是否存在“未定义的行为”问题?

“”中的一些api是否存在“未定义的行为”问题?
EN

Stack Overflow用户
提问于 2022-02-01 14:46:19
回答 1查看 85关注 0票数 0

在中,对于类PropertyDescriptor中的静态方法Accessor有一些重载声明。

这样的重载声明之一是这里

代码语言:javascript
复制
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的引用

该声明的定义在中。

代码语言:javascript
复制
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*

使用的重载也在中。

代码语言:javascript
复制
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仍然存在的情况下超出范围,就会触发一个未定义的行为!

示例:

代码语言:javascript
复制
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天前,我开了一期这里,但一无所获。

编辑:在阅读评论后,我应该补充如下:

  1. napi_property_descriptor是一个简单的C结构。
  2. 该结构的地址稍后将传递给Node-API napi_define_properties
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-11 16:46:35

PropertyDescriptor的当前实现确实存在一个问题。请参阅https://github.com/nodejs/node-addon-api/issues/1127#issuecomment-1036394322

很高兴我没有完全精神错乱。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70942530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档