C++ V8内存泄漏和条件跳转

C++ V8内存泄漏和条件跳转,c++,v8,C++,V8,我已经在我的C应用程序中嵌入了V8。我能够在我的C应用程序中执行javascript。然而,当我试图运行我的C应用程序时,我看到了大量的内存泄漏和条件跳跃。我总共有4个文件 1.美赞臣国际酒店 3.mjse.c 有了这个,我构建了main.c并进行了测试。输出如下所示 char *jscript = "function js_add_elements1() \ { \ return 10; \ };\ js_add_elements1();"; 版本:7.7

我已经在我的C应用程序中嵌入了V8。我能够在我的C应用程序中执行javascript。然而,当我试图运行我的C应用程序时,我看到了大量的内存泄漏和条件跳跃。我总共有4个文件

1.美赞臣国际酒店 3.mjse.c 有了这个,我构建了main.c并进行了测试。输出如下所示

char *jscript =  "function js_add_elements1() \
    { \
        return 10; \
    };\

js_add_elements1();";
版本:7.7.0候选添加2和3结果5 添加2和3结果5添加2和3结果5

从功能的角度来看,它看起来不错。然而,有相当多的条件跳转和内存泄漏,如下所示,只有少数保持较小的大小

==31273== Conditional jump or move depends on uninitialised value(s)
==31273==    at 0x5DB55E8: v8::internal::DeclarationScope::CheckConflictingVarDeclarations() (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x599DCE8: v8::internal::PreParser::PreParseFunction(v8::internal::AstRawString const*, v8::internal::FunctionKind, v8::internal::FunctionLiteral::FunctionType, v8::internal::DeclarationScope*, int*, v8::internal::ProducedPreparseData**, int) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x597C6B5: v8::internal::Parser::SkipFunction(v8::internal::AstRawString const*, v8::internal::FunctionKind, v8::internal::FunctionLiteral::FunctionType, v8::internal::DeclarationScope*, int*, int*, v8::internal::ProducedPreparseData**) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x5970495: v8::internal::Parser::ParseFunctionLiteral(v8::internal::AstRawString const*, v8::internal::Scanner::Location, v8::internal::FunctionNameValidity, v8::internal::FunctionKind, int, v8::internal::FunctionLiteral::FunctionType, v8::internal::LanguageMode, v8::internal::ZoneList<v8::internal::AstRawString const*>*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x5996C7A: v8::internal::ParserBase<v8::internal::Parser>::ParseHoistableDeclaration(int, v8::base::Flags<v8::internal::ParseFunctionFlag, int>, v8::internal::ZoneList<v8::internal::AstRawString const*>*, bool) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x596EFE6: v8::internal::Parser::DoParseProgram(v8::internal::Isolate*, v8::internal::ParseInfo*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x596E6D8: v8::internal::Parser::ParseProgram(v8::internal::Isolate*, v8::internal::ParseInfo*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x599A4D9: v8::internal::parsing::ParseProgram(v8::internal::ParseInfo*, v8::internal::Isolate*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56EF5B5: v8::internal::(anonymous namespace)::CompileToplevel(v8::internal::ParseInfo*, v8::internal::Isolate*, v8::internal::IsCompiledScope*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56F0EA8: v8::internal::Compiler::GetSharedFunctionInfoForScript(v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, v8::Extension*, v8::internal::ScriptData*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, v8::internal::NativesFlag) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56B5C64: v8::ScriptCompiler::CompileUnboundInternal(v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56B6356: v8::ScriptCompiler::Compile(v8::Local<v8::Context>, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason) (in /usr/local/mysys/system/libs/libmjse.so)
==31273== 

==31273==    LEAK SUMMARY:<br>
==31273==    definitely lost: 144 bytes in 1 blocks<br>
==31273==    indirectly lost: 1,744 bytes in 11 blocks<br>
==31273==    possibly lost: 960 bytes in 3 blocks<br>
==31273==    still reachable: 1,474 bytes in 18 blocks<br>
==31273==    suppressed: 0 bytes in 0 blocks<br>
使用如上所述的javascript,我看不到未初始化值的条件内存跳转。原因可能是什么

free(instance);
释放内存,但防止唯一的\u ptr平台成员破坏。尝试:

instance->~MJSEInstance();
free(instance):

或者最好使用new和delete,而不是malloc和free。

这改进了很多。现在内存泄漏消失了。仍然只能访问168个字节。但是条件内存跳转仍然存在。请查看上面的编辑。如果我在javascript中使用一个简单的javascript函数无函数参数,那么我不会看到未初始化值的条件跳转;添加第二行新实例mjsinstance;。看看它是否有用。您可能需要在文件的开头包含一行,它才能工作。我根据您的评论尝试过,仍然有条件跳转或移动取决于valgrind输出中未初始化的值。在V8 hello_world示例中,我在最初的post主函数中使用了上面的javascript,同样的条件跳转问题也存在。然而,当我在javascript函数中没有参数时,我看不到条件跳转。可能是V8中的一个bug。我们在哪里可以提出V8的错误,任何指针。
==31273== Conditional jump or move depends on uninitialised value(s)
==31273==    at 0x5DB55E8: v8::internal::DeclarationScope::CheckConflictingVarDeclarations() (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x599DCE8: v8::internal::PreParser::PreParseFunction(v8::internal::AstRawString const*, v8::internal::FunctionKind, v8::internal::FunctionLiteral::FunctionType, v8::internal::DeclarationScope*, int*, v8::internal::ProducedPreparseData**, int) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x597C6B5: v8::internal::Parser::SkipFunction(v8::internal::AstRawString const*, v8::internal::FunctionKind, v8::internal::FunctionLiteral::FunctionType, v8::internal::DeclarationScope*, int*, int*, v8::internal::ProducedPreparseData**) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x5970495: v8::internal::Parser::ParseFunctionLiteral(v8::internal::AstRawString const*, v8::internal::Scanner::Location, v8::internal::FunctionNameValidity, v8::internal::FunctionKind, int, v8::internal::FunctionLiteral::FunctionType, v8::internal::LanguageMode, v8::internal::ZoneList<v8::internal::AstRawString const*>*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x5996C7A: v8::internal::ParserBase<v8::internal::Parser>::ParseHoistableDeclaration(int, v8::base::Flags<v8::internal::ParseFunctionFlag, int>, v8::internal::ZoneList<v8::internal::AstRawString const*>*, bool) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x596EFE6: v8::internal::Parser::DoParseProgram(v8::internal::Isolate*, v8::internal::ParseInfo*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x596E6D8: v8::internal::Parser::ParseProgram(v8::internal::Isolate*, v8::internal::ParseInfo*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x599A4D9: v8::internal::parsing::ParseProgram(v8::internal::ParseInfo*, v8::internal::Isolate*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56EF5B5: v8::internal::(anonymous namespace)::CompileToplevel(v8::internal::ParseInfo*, v8::internal::Isolate*, v8::internal::IsCompiledScope*) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56F0EA8: v8::internal::Compiler::GetSharedFunctionInfoForScript(v8::internal::Isolate*, v8::internal::Handle<v8::internal::String>, v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, v8::Extension*, v8::internal::ScriptData*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, v8::internal::NativesFlag) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56B5C64: v8::ScriptCompiler::CompileUnboundInternal(v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason) (in /usr/local/mysys/system/libs/libmjse.so)
==31273==    by 0x56B6356: v8::ScriptCompiler::Compile(v8::Local<v8::Context>, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason) (in /usr/local/mysys/system/libs/libmjse.so)
==31273== 

==31273==    LEAK SUMMARY:<br>
==31273==    definitely lost: 144 bytes in 1 blocks<br>
==31273==    indirectly lost: 1,744 bytes in 11 blocks<br>
==31273==    possibly lost: 960 bytes in 3 blocks<br>
==31273==    still reachable: 1,474 bytes in 18 blocks<br>
==31273==    suppressed: 0 bytes in 0 blocks<br>
char *jscript =  "function js_add_elements1() \
    { \
        return 10; \
    };\

js_add_elements1();";
free(instance);
instance->~MJSEInstance();
free(instance):