0

我正在研究 bitset 实现。bitset 使用一个数组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];
}

这样做可以让我的程序始终如一地允许我的整个程序访问位数组。我遇到的一个问题是我的析构函数似乎无法删除数据

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

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

4

1 回答 1

1

您可以使用矢量容器:

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

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


PSunsigned long long不能保证正好是 64 位。它允许比这更大。如果这对您的程序至关重要,那么您应该使用std::uint64_t标准库中的内容。这主要只与未来的兼容性有关。

于 2019-05-12T23:51:48.237 回答