c 11 – 使用自定义分配器的std :: promise似乎使用全局新的

上下文:我正在编写一个库,它为许多stdlib数据结构中的自定义分配器公开,以便为想要自定义内存分配以实现实时性能的用户提供服务.

我想使用std :: promise和std :: future的自定义分配器.我的理解是,当一个allocator传递给std :: promise时,它的未来对象也会使用该自定义分配器.

我的测试覆盖全局new和delete以跟踪调用默认运算符的次数.我还实现了一个使用malloc和free的自定义分配器,但使用不同的状态来计算分配/解除分配(在实际例子中,它将替换为实时安全分配器).

看来,当我为一个“大”对象调用std :: promise :: set_value时,调用全局运算符new和delete,即使promise是使用自定义分配器构造的.

这是一个基本的例子. (为简洁起见,删除了分配器样板,您可以在Gist:https://gist.github.com/jacquelinekay/a4a1a282108a55d545a9上看到完整的可编译版本)

struct Foo {
  std::vector<int, InstrumentedAllocator<int>> bar;
};

int main(int argc, char ** argv) {
  (void) argc;
  (void) argv;
  InstrumentedAllocator<void> alloc;

  std::promise<Foo> promise_(std::allocator_arg, alloc);
  std::shared_future<Foo> future_ = promise_.get_future().share();

  // Start a thread that blocks for a few ms and sets the future value
  std::thread result_thread(
    [&promise_]() {
      Foo result;
      result.bar.push_back(1);
      result.bar.push_back(2);
      result.bar.push_back(3);
      // test_init starts counting calls to global new/delete
      // (stored in variables global_runtime_allocs/deallocs)
      test_init = true;
      std::this_thread::sleep_for(std::chrono::milliseconds(5));
      promise_.set_value(result);
      test_init = false;
    }
  );
  future_.wait();
  result_thread.join();
  std::cout << "Runtime global allocations: " << global_runtime_allocs << " (expected: 0)" << std::endl;
  std::cout << "Runtime global deallocations: " << global_runtime_deallocs << " (expected: 0)" << std::endl;
}

此示例的全局运算符new也打印“运行时”分配的大小(来自std :: promise :: set_value),从而产生以下输出:

$clang++ promise_allocator.cpp -std=c++11 -lpthread
$./a.out
Allocation size: 16
Runtime global allocations: 1 (expected: 0)
Runtime global deallocations: 1 (expected: 0)

我在gcc 4.8和Clang 3.4上得到了相同的结果.这是对标准的正确解释吗?我希望set_value使用promise的分配器.

最佳答案 这似乎是4.9版本系列libstdc中的一个错误,该错误在版本5发行版系列中得到修复.使用
version 5.1或更高版本在Wandbox上运行您的要点仅产生输出:

Runtime global allocations: 0 (expected: 0)
Runtime global deallocations: 0 (expected: 0)
点赞