将`char *`与`delete`解除分配 - 内存泄漏?

时间:2014-06-10 12:52:54

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

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); }

// ...

2 个答案:

答案 0 :(得分:8)

  

是否保证deallocateSomething(ptr)将释放所有已分配的字节,即使它不知道调用allocateSomething()时使用的typename T?

不,没有任何保证,这是未定义的行为。

  

或者是否有必要对deallocateSomething进行模板化?

是的,总的来说。

您必须使用匹配的分配/取消分配方法。如果您要使用delete取消分配,则必须使用new进行分配。如果您更改了分配,那么它不会使用std::allocator(您无法控制并且不知道它如何分配)而是使用new char[sizeof(T)]分配,那么您可以安全地释放{{1 (但不是delete[] !您必须使用delete

答案 1 :(得分:4)

您必须使用匹配的分配和免费功能。即。

  • mallocfree
  • newdelete
  • new[]delete[]
  • std::allocator<>::allocatestd::allocator<>::deallocate。这里指定默认版本使用new / delete,但如果它进行了一些分配分组(例如,它可能低于某个大小而不是高于分布),则不指定它,所以你是什么可以在实现中工作,而不是在另一个实现中工作。