template<typename T> char* allocateSomething()
{
return reinterpret_cast<char*>(std::allocator<T>{}.allocate(1));
}
void deallocateSomething(char* mPtr) { delete mPtr; }
struct TestType { ... };
int main()
{
char* ptr{allocateSomething<TestType>()};
deallocateSomething(ptr);
return 0;
}
是否保证deallocateSomething(ptr)
即使在调用typename T
时不知道allocateSomething<T>()
时也会释放所有已分配的字节?
或者是否有必要对deallocateSomething
进行模板化?
编辑:我手动处理对象的构造/破坏。
编辑2:这会正常工作吗?
template<typename T> char* allocateSomething()
{
return reinterpret_cast<char*>(std::malloc(sizeof(T)));
}
void deallocateSomething(char* mPtr) { std::free(mPtr); }
// ...
答案 0 :(得分:8)
是否保证deallocateSomething(ptr)将释放所有已分配的字节,即使它不知道调用allocateSomething()时使用的typename T?
不,没有任何保证,这是未定义的行为。
或者是否有必要对deallocateSomething进行模板化?
是的,总的来说。
您必须使用匹配的分配/取消分配方法。如果您要使用delete
取消分配,则必须使用new
进行分配。如果您更改了分配,那么它不会使用std::allocator
(您无法控制并且不知道它如何分配)而是使用new char[sizeof(T)]
分配,那么您可以安全地释放{{1 (但不是delete[]
!您必须使用delete
)
答案 1 :(得分:4)
您必须使用匹配的分配和免费功能。即。
malloc
与free
new
与delete
new[]
与delete[]
std::allocator<>::allocate
与std::allocator<>::deallocate
。这里指定默认版本使用new
/ delete
,但如果它进行了一些分配分组(例如,它可能低于某个大小而不是高于分布),则不指定它,所以你是什么可以在实现中工作,而不是在另一个实现中工作。