我想在类型为std :: vector。
的类静态容器中存储v8 :: Local是TheClass.h
:
class SomeClass : public node::ObjectWrap {
public:
static void Init(Handle <Object> exports);
static Handle <Object> NewInstance();
static std::vector<Local<Object>*> container;
private:
SomeClass();
~SomeClass();
static NAN_METHOD(New);
static Persistent <Function> constructor;
};
是TheClass.cpp
:
Handle <Object> TheClass::NewInstance() {
NanEscapableScope();
const unsigned argc = 0;
Local <Value> argv[argc] = {};
Local <Function> cons = NanNew < Function > (constructor);
Local <Object> instance = cons->NewInstance(argc, argv);
if(container.size() > 0) {
return *container.at(0);
}
container.push_back(&instance);
return NanEscapeScope(instance);
}
如果我两次调用TheClass::NewInstance
,则第二个返回的对象与第一个返回的对象不同。
Local<Object> instance1 = TheClass::NewInstance();
Local<Object> instance2 = TheClass::NewInstance(); // is not the same with instance 1
答案 0 :(得分:1)
函数TheClass::NewInstance()
包含未定义的行为。您正在将指向instance
的指针推入向量,但该对象在超出范围(即从函数返回)后已销毁。由于instance
具有自动存储持续时间,因此它可能存在于堆栈中,并且它占用的内存最终将被覆盖。下次在向量中访问该元素时,它不再是有效对象,任何使用它的尝试都是不可预测的。这意味着当您访问它时,对象的内容将是随机垃圾,与将其推入堆栈时的内容不同。
如何解决这个问题取决于各种各样的事情,但您可以从将矢量更改为
开始std::vector<Handle<Object>> container;
并将存储在矢量中的代码更改为
container.push_back(instance);
这将允许{em>值存储Handle
并自动管理它引用的对象的生命周期。
答案 1 :(得分:1)
问题来自std::vector<Local<Object> >
类型。我必须使用std::vector<Persistent<Object> >
,然后将对象存储为Persistent<Object>
container.push_back(Persistent<Object>::New(instance));