使用堆成员删除对象

时间:2019-05-12 23:47:02

标签: c++ new-operator delete-operator stack-allocation

我正在研究位集实现。该位集使用unsigned long long数组存储位。

class bitset{
    typedef unsigned long long uint64;
    uint64* bits;
    ...
}

由于我需要此位集来存储大量数据,因此我发现,当我使用uint64关键字初始化new数组以将其构建在堆上时,它的工作效果最佳。

bitset::bitset(int n_bits){
    if (n_bits % 64 !=0) size (n_bits / 64) + 1;
    else size = n_bits / 64;
    this->data = new uint64[size];
}

执行do可使我的程序始终允许我的整个程序访问位数组。 我遇到的一个问题是我的析构函数似乎无法删除数据

bitset::~bitset(){
    delete[] this->data;
}

在没有析构函数的情况下,发生内存泄漏(如预期的那样),在析构函数的情况下,我遇到运行时错误Error in `./a.out': double free or corruption (out): 我尝试使用谷歌搜索无济于事。我对C ++还是相当陌生,因此,如果您对类内的堆栈/堆行为有任何见解,将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用矢量容器:

class bitset{
    ...
    std::vector<uint64> bits;
    ...

Vector负责内存分配,因此不会出现意外删除内存多次或意外泄漏内存的问题。


P.S。 unsigned long long不能保证完全是64位。它可以大于此值。如果这对于您的程序至关重要,那么您应该使用标准库中的std::uint64_t。这主要只与将来的兼容性有关。