我有一个函数,它将参数的值存储到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 ++错误。
答案 0 :(得分:0)
如果您计划在C ++中存储v8值,则需要使它们是持久的而不是本地的,因此它们与句柄作用域无关,并且在释放句柄作用域时不会被垃圾收集。
v8::Persistent
和std::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);
}
我希望这可以帮助那些人。