我试图实现一个可以动态调整大小的数组类,它将在不初始化值的情况下分配内存。我的问题是关于我以后如何释放内存:
我可以用这种方式实现我的代码吗?:
template<typename Type>
class Array {
Type *values;
Array(int size) : values(new (size * sizeof(Type)) char()) {}
~Array() {
delete[] values;
}
}
或者我需要这样的东西吗?:
template<typename Type>
class Array {
Type *values;
void *memory;
Array(int size) : memory(new (size * sizeof(Type)) char()), values(memory), size(size) {}
~Array() {
delete[] memory;
}
}
请注意!!!!我知道这将分配内存而不初始化任何Type对象。这是我的代码的预期行为。此外,上面的代码不是我的完整实现,它只是将分配和释放内存的代码,因为这是我对此问题感兴趣的内容。
经过进一步研究,我发现我应该使用malloc()
和free()
来做我想做的事情。感谢所有答案和评论者。
答案 0 :(得分:2)
您可以使用Type*
让生活更轻松,并使用operator new
获取内存而无需构建对象。
Type* values; //No aliasing/casting issues
Array(int size) : values((Type*)::operator new(sizeof(Type) * size)) //...
~Array() { /*clean up extant objects*/ ::operator delete(values); }
然后,您可以使用放置新的和显式的析构函数调用来管理元素。此外,placement new不会分配内存。它在指定的地址构造一个对象。
答案 1 :(得分:1)
Placement new实际上并没有分配任何内存。它只是用于调用具有已分配内存的构造函数的语法。
在析构函数中,必须为每个当前元素手动调用析构函数,然后以与分配内存相同的方式释放内存。 非常小心例外。
您应该使用std::allocator<T>::allocate
和std::allocator<T>::deallocate
,但可以使用malloc/free
,new char[]/delete[] (char*)arr
或::operator new/::operator delete
。