hello-world.cc 样本似乎泄漏了内存

hello-world.cc sample seems to leak memory

刚开始尝试在 C++ 项目中嵌入 V8。鉴于这个库的复杂性,我认为如果我可以使用 valgrind 作为一个额外的回归测试器,它会不那么可怕。希望定期检查来自 valgrind 的干净 运行 至少有助于在我走得太远之前捕获某些类型的错误。

不幸的是,似乎开箱即用 hello-world.cc 样本泄漏了一些 kB 的内存。从示例中剥离内容,即使只是创建和删除一个 Isolate 也不会给我一个干净的 运行.

// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "libplatform/libplatform.h"
#include "v8.h"

int main(int argc, char* argv[]) {
  // Initialize V8.
  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();

  // Create a new Isolate and make it the current one.
  v8::Isolate::CreateParams create_params;
  create_params.array_buffer_allocator =
      v8::ArrayBuffer::Allocator::NewDefaultAllocator();
  v8::Isolate* isolate = v8::Isolate::New(create_params);

  // Dispose the isolate and tear down V8.
  isolate->Dispose();
  v8::V8::Dispose();
  v8::V8::ShutdownPlatform();
  delete create_params.array_buffer_allocator;
  return 0;
}

我看到这已经被其他人注意到了:https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0

我想我的问题是:是否值得尝试使用 v8 实现无泄漏,或者库是否可能总是会在 breeze 中留下一些位和字节,就像现在一样通常是复杂库的情况?或者,如果我(和其他人)在 hello-world 示例中做错了什么,那将很有用。

这里是 V8 开发人员。我很确定 V8 是 LSan (LeakSanitizer) 干净的。我们不再定期使用 Valgrind 进行测试(主要是因为它太慢了)。

在 Valgrind 中使用 v8_hello_world 二进制文件进行的快速测试中,我确实看到了两个泄漏报告。其中之一看起来是故意的:它在 LSan 和 "not really a leak" 中被明确忽略,因为内存旨在跨 Isolates 共享,因此不允许任何 Isolate 在拆卸时释放它。您可以尝试在进程退出时释放它,但这不会带来切实的好处,它只会安抚消毒剂,并且会花费工程和 CPU/execution 努力来实现这一目标。我不完全确定另一份报告,但我怀疑它是相关的。

长话短说:

  • Valgrind 可能缺少(非常短的)故意 "leaks"(无论出于何种原因真实或误检测)允许列表
  • V8 不应该泄漏内存;如果是这样,那就是一个错误
  • 我们主要关心长期 运行 Isolates 是否无泄漏,而不太关心单个进程创建和销毁数百万 Isolates 是否无泄漏。我确实认为这也应该有效,但实际上,如果每个隔离物都有少量固定泄漏,那么修复它可能不那么紧迫。

this has already been noted by others: https://groups.google.com/forum/#!topic/v8-users/8Jv0JoTAMk0

如果我没看错那个线程,它明确地关注有人观察到的内存消耗,但 Valgrind 没有 报告为泄漏。