我有简单的代码片段,试图释放内存使用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.效果:相当于:Run Code Online (Sandbox Code Playgroud)location->~T();
该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].这种替代分配器模型在效率关键型应用中很常见.
....