C++ 使用V8库中的GetInternalField()时出现分段错误

C++ 使用V8库中的GetInternalField()时出现分段错误,c++,v8,C++,V8,我使用v8库的较新版本。当我从运行演示时 在UnwrapMap函数中调用GetInternalField时,我的程序崩溃。有没有人有类似的问题,或者他们知道如何解决? 例如: map<string, string>* JsHttpRequestProcessor::UnwrapMap(Local<Object> obj) { Local<External> field = Local<External>::Cast(obj->GetInt

我使用v8库的较新版本。当我从运行演示时

在UnwrapMap函数中调用GetInternalField时,我的程序崩溃。有没有人有类似的问题,或者他们知道如何解决? 例如:

map<string, string>* JsHttpRequestProcessor::UnwrapMap(Local<Object> obj) {
  Local<External> field = Local<External>::Cast(obj->GetInternalField(0)); // here segmentation fault
  void* ptr = field->Value();
  return static_cast<map<string, string>*>(ptr);
}
map*JsHttpRequestProcessor::UnwrapMap(本地obj){
Local field=Local::Cast(obj->GetInternalField(0));//此处分段错误
void*ptr=字段->值();
返回静态_-cast(ptr);
}
编辑:


我解决了我的问题。我必须插入宏V8\u COMPRESS\u POINTERS=1。谢谢

这里提供的样品很好用;你有没有以任何方式修改它?你到底是怎么运作的


如果知道
obj
是具有内部字段的对象,则只能调用
obj->GetInternalField(0)
。您可以使用
obj->InternalFieldCount()
进行检查。只有当您(嵌入者)提供了内部字段时,对象才具有内部字段。如果你试图将一个规则的JavaScript对象转换成一个C++映射,你必须迭代它的属性,而不是它的内部字段。您在分配的地址空间之外访问了内存。首先查看obj是否为nullptr,然后在另一行上尝试调用obj->getInternalField(0)并查看它返回的内容。如果没有崩溃,那么很可能::cast出错了谢谢您的回复。Obj不是空PTR。仅当调用obj->GetInternalField(0)时崩溃。调用其他方法是正常的(例如obj->GetIdentityHash()是正常的)obj可能没有正确设置。也许可以尝试实例化本地obj的默认对象,并调用GetInternalField(0)谢谢您的评论。调用obj->InternalFieldCount()时,返回值为1。从示例…我只将“string file”更改为“string file=“/home/aloha/test””,其中test是包含以下内容的文件:“options.test;”当文件为空时,它会工作,因为它不调用UnwrapMap,其中是GetInternalField(0);然后立即返回结果->GetInternalField(0);结果是一样的……分割错误。