以下代码可以安全地工作,不会出现段错误和内存泄漏。
::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。
答案 0 :(得分:0)
C ++规范(ISO / IEC 14882:2014)在表28中定义了deallocate(p,n):
在此调用之前,必须销毁p指向的区域中的所有n个T对象。 n必须与为获得该内存而分配的值匹配。不扔 例外情况。 (...)
因此您应该将正确的大小提供为n是正确的。 (如果不是,则处于“不确定行为”领域。) 您当前使用的std :: allocator的解除分配实现可能会忽略该大小。 (例如,如MSVC的版本,如这里的堆栈溢出问题所示。)但是,解除分配的实现或另一分配的调试版本的行为可能有所不同。因此,请使用匹配值。