阻止v8 :: Local值被垃圾回收

时间:2016-02-07 02:07:41

标签: c++ garbage-collection v8

我有一个函数,它将参数的值存储到C ++类的std::vector<v8::Local<v8::Value>>属性中,并像这样暴露为ObjectWrap:

NAN_METHOD(MyObject::Write) {
  MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.This());
  obj->data.push_back(info[0]);
}

但是,当我尝试从另一个 C ++函数读回值时,该值将丢失,并变为undefined

我将一个数字传递给MyObject::Write,我可以确认info[0]->IsNumber()在将其推送到向量之前返回true,但是当读回它时,值它不是一个数字,实际上我使用false中的Is<Type>方法为我测试的所有类型返回v8::Value,但仍为true返回BooleanValue() }。

我的猜测是变量在MyObject::Write返回后被垃圾收集,但我不知道如何防止这种情况发生。

我目前正在尝试将值初始化为Persistent值。我尝试了以下尝试但没有成功:

Nan::CopyablePersistentTraits<v8::Value>::CopyablePersistent p;
Nan::Persistent<v8::Value> persistent(info[0]);
Nan::CopyablePersistentTraits::Copy(persistent, p);

v8::Isolate *isolate = info.GetIsolate();
v8::Persistent<v8::Value, v8::CopyablePersistentTraits<v8::Value>> persistent(isolate, info[0]);

但是收到了大量的C ++错误。

2 个答案:

答案 0 :(得分:0)

如果您计划在C ++中存储v8值,则需要使它们是持久的而不是本地的,因此它们与句柄作用域无关,并且在释放句柄作用域时不会被垃圾收集。

v8::Persistentstd::vector<>的南has version-independant wrappers因为在Nan::Persistent内部使用,您还需要使用Nan::CopyablePersistentTraits初始化// INSERT INTO public function QueryInsert($table, $fields, $values, $format) { $values = explode(',',$values); // Metto i VALUES di Insert in un array $placeholders = ""; // Inizializzo Segnaposto $data = ""; $i = 0; foreach($values as $k => $v) { // Creo i placeholders in base al numero di Valori VALUES $placeholders .= '?,'; } $placeholders = substr($placeholders, 0, -1); // Tolgo l'ultima virgola $DB = DBConn::ConnettiDB(); // Richiamo la funzione di connessione al DB $statem = $DB->prepare("INSERT INTO $table($fields) VALUES ($placeholders)"); // Preparo query per inserimento $statem->bind_param("$format",$values); // WORKING $statem->execute(); // Eseguo query INSERT // Controllo se la query INSERT ha avuto successo if($statem->affected_rows != -1) { return true; } echo "<br>ERRORE Insert: <br>" . $statem->error; } // FINE INSERT ,以便它可以复制(或为它制作一个自己的参考计数容器)。

答案 1 :(得分:0)

我遇到了解决这个问题的问题。这里有许多模板内容,我们都错过了。这是我发现最易读的解决方案:

// Define the copyable persistent
v8::CopyablePersistentTraits<v8::Value>::CopyablePersistent p;

// Create the local value
auto val = v8::Local<v8::Value>::New(
    v8::Isolate::GetCurrent(), //< Isolate required
    v8::Integer::New(v8::Isolate::GetCurrent(), v) //< Isolate required
);

// Reset() is a TEMPLATE FUNCTION, you have to template it with the same
// template type parameter as the v8::Local you are passing
p.Reset<v8::Value>(v8::Isolate::GetCurrent(), val); //< Isolate required

通过&#34; info&#34;我假设你指的是一个v8 :: FunctionCallbackInfo引用。如果是这样,上面的代码将崩溃到以下内容:

void SomeFunc(v8::FunctionCallbackInfo<v8::Value>& info) {
    v8::CopyablePersistentTraits<v8::Value>::CopyablePersistent p;
    p.Reset<v8::Value>(info[0]);
}

因为持久性现在是可复制的,所以您可以将其存储在标准库容器中。这是我的用例。这是在向量中存储值的示例:

std::vector<v8::CopyablePersistentTraits<v8::Value>::CopyablePersistent> vect;

void AccumulateData(v8::FunctionCallbackInfo<v8::Value>& info) {
    v8::CopyablePersistentTraits<v8::Value>::CopyablePersistent p;
    p.Reset<v8::Value>(info[0]);
    vect.push_back(p);
}

我希望这可以帮助那些人。