在c ++ 17中使用std :: destroy_at()?

Mah*_*dra 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 10

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

template <class T>
void destroy_at(T*location);
1.效果:相当于:

location->~T();
Run Code Online (Sandbox Code Playgroud)

cppreference项给出了为什么这可能需要一个例子.在这种情况下,我们将放置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);
}
Run Code Online (Sandbox Code Playgroud)

扩展内存管理工具中提出这一建议的提议是:

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

  • 考虑到为某些类型获取伪析构函数名称是多么困难(特别是如果它们是别名的),这是非常需要的. (2认同)