【问题标题】:Allocating and deallocating memory c++分配和释放内存 C++
【发布时间】:2016-02-17 07:02:41
【问题描述】:

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

我可以这样实现我的代码吗?:

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

【问题讨论】:

  • 为什么不memory(new Type[size])
  • FWIW,为什么不vector&lt;Type&gt; 或者至少研究一下它的工作原理和作用!在第二个示例中,您从不构造任何 Type 顺便说一句,但您破坏了其中的 size,这肯定是错误的。另外,你的分配语法看起来很奇怪,我本来希望new char[some size here]
  • 我不使用内存(new Type[size])或vector的原因是因为两个实例都会分配内存,然后为每个位置构造一个实例。我在我的问题中指定我不想创建任何类型的实例,只为它分配内存。
  • @Dynisious 我建议你研究一下new char[42]new char[42]() 之间的区别。

标签: c++ memory-management placement-new


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    您可能应该使用std::allocator&lt;T&gt;::allocatestd::allocator&lt;T&gt;::deallocate,但您可以使用malloc/freenew char[]/delete[] (char*)arr::operator new/::operator delete

    【讨论】:

    • 不包括在我的答案中:class-scope operator newoperator delete 因为我不理解它们。
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2020-08-25
    • 1970-01-01
    • 2023-03-03
    • 2016-02-19
    相关资源
    最近更新 更多