STD分配器是否在堆上动态分配内存?它安全地删除了内存吗?

时间:2017-06-24 23:43:06

标签: c++ c++11 memory-management

所以我试图了解C ++中的std::allocator<>,并且在参考网站上对一些事情感到困惑。特别是因为我读过构造和解构器的分配器方法在C ++ 17中被弃用

这是我作为示例编写的以下代码

// Example with pointers and allocators
#include <iostream>
#include <memory>




int main()
{
  std::allocator<int> nums;
  int * first = nums.allocate(1); //is this on the heap, like with calling new int(4)?
  int * second = nums.allocate(2);
  *first = 7;
  second[0] = 2;
  second[1] = 4;
  std::cout << *first << std::endl;
  std::cout << second[1] << std::endl;
  nums.deallocate(first, 1); //is the int safely deleted from memory?
  nums.deallocate(second, 2);
}

当一个人调用allocate方法时,返回的指针指向堆上的动态内存块还是分配了内存堆栈?

此外,当一个人调用deallocate方法时,被解除分配的指针是否还要从内存中删除它?解除分配等同于delete

1 个答案:

答案 0 :(得分:1)

  

当一个人调用allocate方法时,返回的指针是否指向堆上的动态内存

C ++标准没有使用 heap 这个词,但是std::allocator免费商店分配,这通常称为堆,因为这是通常用于实现它的数据结构。

  

当一个人调用deallocate方法时,被解除分配的指针是否还要从内存中删除它?解除分配等同于delete

delete做了两件事:它调用对象的析构函数并释放内存。 std::allocator::deallocate执行后一部分而后者执行。 std::allocator::destroy执行前者。请注意,在内存被释放时,未指定,只有它是。