C ++分配器分配/解除分配

时间:2016-03-04 23:06:06

标签: memory allocator

以下代码可以安全地工作,不会出现段错误和内存泄漏。

::std::allocator<int> alloc;

auto ptr = alloc.allocate(1);
alloc.deallocate(ptr, 1); 

不调用deallocate,预计会发生内存泄漏(肯定会丢失4个字节)。

::std::allocator<int> alloc;
auto ptr = alloc.allocate(1);

但是,以下代码不会引入泄漏。为什么即使我用n=0调用deallocate来释放内存?

::std::allocator<int> alloc;
auto ptr = alloc.allocate(1);
alloc.deallocate(ptr, 0);

此外,我希望以下代码抛出一个段错误,但事实并非如此。可能是什么原因?

::std::allocator<int> alloc;
auto ptr = alloc.allocate(1);
alloc.deallocate(ptr, 1000);

所有编译都没有优化。内存检测基于valgrind。

1 个答案:

答案 0 :(得分:0)

C ++规范(ISO / IEC 14882:2014)在表28中定义了deallocate(p,n):

  

在此调用之前,必须销毁p指向的区域中的所有n个T对象。   n必须与为获得该内存而分配的值匹配。不扔   例外情况。 (...)

因此您应该将正确的大小提供为n是正确的。 (如果不是,则处于“不确定行为”领域。) 您当前使用的std :: allocator的解除分配实现可能会忽略该大小。 (例如,如MSVC的版本,如这里的堆栈溢出问题所示。)但是,解除分配的实现或另一分配的调试版本的行为可能有所不同。因此,请使用匹配值。