我正在尝试嵌入V8,但我有一些内存泄漏。下面的最小代码重现了泄漏。
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打印论文在输出中泄漏
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.你知道我忘了什么吗?
提前感谢您的帮助;)
发布于 2019-06-13 19:48:33
我复制了你的代码,并在linux环境下运行,设置了-fsanitize=address标志,没有得到任何内存泄漏错误。
发布于 2021-11-21 17:52:48
这里有一个解决方法,可以解决大多数内存泄漏问题。要调用私有函数FreeProcessWidePtrComprCageForTesting(),必须重新定义内部类IsolateAllocator。第一种方式是添加一个新函数Free(),以便能够调用私有函数。
namespace v8::internal
{
class IsolateAllocator
{
public:
static void Free() { FreeProcessWidePtrComprCageForTesting(); }
private:
static void FreeProcessWidePtrComprCageForTesting();
};
} // namespace v8::internal或者不向IsolateAllocator添加函数,而是像在v8单元测试中那样使用朋友类(我只是重命名朋友类)。
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()函数
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<>……
https://stackoverflow.com/questions/54829503
复制相似问题