繁体   English   中英

分配和释放内存c ++

[英]Allocating and deallocating memory c++

我正在尝试实现一个可以动态调整大小的数组类,它将在不初始化值的情况下分配内存。 我的问题是关于我以后如何释放内存:

我可以用这种方式实现我的代码吗?:

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()来做我想做的事情。 感谢所有答案和评论者。

您可以使用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不会分配内存。 它在指定的地址构造一个对象。

Placement new实际上并没有分配任何内存。 它只是用于调用具有已分配内存的构造函数的语法。

在析构函数中,必须为每个当前元素手动调用析构函数,然后以与分配内存相同的方式释放内存。 对异常要非常小心。

您应该使用std::allocator<T>::allocatestd::allocator<T>::deallocate ,但您可以使用malloc/freenew char[]/delete[] (char*)arr ,或者::operator new/::operator delete

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM