首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌入式谷歌v8内存泄漏示例

嵌入式谷歌v8内存泄漏示例
EN

Stack Overflow用户
提问于 2019-02-22 22:41:31
回答 2查看 237关注 0票数 1

我正在尝试嵌入V8,但我有一些内存泄漏。下面的最小代码重现了泄漏。

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    // V8 version 7.1.302.33
    v8::V8::InitializeICUDefaultLocation(argv[0]);
    v8::V8::InitializeExternalStartupData(argv[0]);
    std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
    v8::V8::InitializePlatform(platform.get());
    v8::V8::Initialize();

    v8::Isolate::CreateParams create_params;
    create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();

    v8::Isolate* pIsolate = v8::Isolate::New(create_params); // If I remove this line and the next one, memory leak disappears
    pIsolate->Dispose();

    v8::V8::Dispose();
    v8::V8::ShutdownPlatform();
    delete create_params.array_buffer_allocator;
}

使用此代码,我的visual studio 2017打印论文在输出中泄漏

代码语言:javascript
复制
Detected memory leaks!
    Dumping objects ->
{5565} normal block at 0x000001BA6F417950, 8 bytes long.
    Data: < i    > 00 00 E8 69 18 00 00 00
{5564} normal block at 0x000001BA6F416960, 16 bytes long.
    Data : <8 >o > 38 D7 3E 6F BA 01 00 00 00 00 00 00 00 00 00 00
{5563} normal block at 0x000001BA6F3ED720, 56 bytes long.
    Data: <  >o > o > A0 D6 3E 6F BA 01 00 00 A0 D6 3E 6F BA 01 00 00
{989} normal block at 0x000001BA6F4194E0, 128 bytes long.
    Data: <  >o > o > A0 D6 3E 6F BA 01 00 00 A0 D6 3E 6F BA 01 00 00
{988} normal block at 0x000001BA6F416CD0, 16 bytes long.
    Data: < p `             > 70 B4 60 0A FF 7F 00 00 00 00 00 00 00 00 00 00
{987} normal block at 0x000001BA6F417270, 16 bytes long.
    Data : < X `             > 58 B4 60 0A FF 7F 00 00 00 00 00 00 00 00 00 00
{986} normal block at 0x000001BA6F3ED6A0, 56 bytes long.
    Data : <  >o > o > 20 D7 3E 6F BA 01 00 00 20 D7 3E 6F BA 01 00 00
    Object dump complete.

你知道我忘了什么吗?

提前感谢您的帮助;)

EN

回答 2

Stack Overflow用户

发布于 2019-06-13 19:48:33

我复制了你的代码,并在linux环境下运行,设置了-fsanitize=address标志,没有得到任何内存泄漏错误。

票数 0
EN

Stack Overflow用户

发布于 2021-11-21 17:52:48

这里有一个解决方法,可以解决大多数内存泄漏问题。要调用私有函数FreeProcessWidePtrComprCageForTesting(),必须重新定义内部类IsolateAllocator。第一种方式是添加一个新函数Free(),以便能够调用私有函数。

代码语言:javascript
复制
namespace v8::internal
{
class IsolateAllocator
{
public:
    static void Free() { FreeProcessWidePtrComprCageForTesting(); }
private:
    static void FreeProcessWidePtrComprCageForTesting();
};
} // namespace v8::internal

或者不向IsolateAllocator添加函数,而是像在v8单元测试中那样使用朋友类(我只是重命名朋友类)。

代码语言:javascript
复制
namespace v8::internal
{
class IsolateAllocator
{
private:
    friend class SequentialUnmapperTest;
    static void FreeProcessWidePtrComprCageForTesting();
};

class SequentialUnmapperTest
{
public:
    static void Free() { IsolateAllocator::FreeProcessWidePtrComprCageForTesting(); }
};
} // namespace v8::internal

v8::V8::Dispose();之前调用Free()函数

代码语言:javascript
复制
    isolate->Dispose();
    v8::internal::IsolateAllocator::Free();
    v8::V8::Dispose();
    v8::V8::ShutdownPlatform();
    delete create_params.array_buffer_allocator;

由于调用v8::V8::InitializeICUDefaultLocation() (它在调用udata_setCommonData()时进行一些分配)和其他原因造成的内存泄漏仍然很少,这是由于code-range.cc中的base::LazyInstance<std::weak_ptr<CodeRange>>::type process_wide_code_range_存储了一个永远不会销毁的std::weak_ptr<>……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54829503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档