c ++ 17中std :: destroy_at()的用法?

时间:2018-09-26 03:36:24

标签: c++ c++17

我有一个简单的代码段,试图使用std::destroy_at()释放内存:

#include <iostream>
#include <memory>

using namespace std;

class base
{
public:
  ~base()
  {
    cout << "des" << endl;
  }
};
int main()
{
  {
    base* b1 = new base();
    std::destroy_at(b1); // destructor is executed for b1 object (but memory is not freed for b1)
  }
return 0;
}

有人可以指导我如何使用destroy_at()释放内存吗?对于原始数据类型也观察到相同的行为。 最新使用VS2017编译器。

1 个答案:

答案 0 :(得分:8)

std::destroy_at()并不意味着要根据[specialized.destroy]p1释放内存,而是要调用对象的析构函数:

  

template
     void destroy_at(T *位置);
  1.效果:等同于:

location->~T();

cppreference entry举例说明了为什么可能需要这样做。在这种情况下,我们已将new放置到缓冲区中,而无需释放内存:

struct Tracer {
    int value;
    ~Tracer() { std::cout << value << " destructed\n"; }
};

int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 8];

    for (int i = 0; i < 8; ++i)
        new(buffer + sizeof(Tracer) * i) Tracer{i}; //manually construct objects

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    for (int i = 0; i < 8; ++i)
        std::destroy_at(ptr + i);
}

Extending memory management tools中引入此建议的提案说:

  

标准库和用户库在不使用符合标准的分配器的情况下管理内存是很常见的。他们可能使用内部缓冲区(如可选),或者使用不管理对象生存期的分配器模型[bde] [sgi] [eastl] [bitsquid]。这种替代分配器模型在对效率有严格要求的应用中很常见。
  ....