在类static static std :: vector </v8 :: object>中存储v8 :: Local <v8 :: object>

时间:2014-12-19 14:14:27

标签: c++ node.js v8

我想在类型为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

2 个答案:

答案 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));