我正在研究位集实现。该位集使用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 ++还是相当陌生,因此,如果您对类内的堆栈/堆行为有任何见解,将不胜感激。
答案 0 :(得分:1)
您可以使用矢量容器:
class bitset{
...
std::vector<uint64> bits;
...
Vector负责内存分配,因此不会出现意外删除内存多次或意外泄漏内存的问题。
P.S。 unsigned long long
不能保证完全是64位。它可以大于此值。如果这对于您的程序至关重要,那么您应该使用标准库中的std::uint64_t
。这主要只与将来的兼容性有关。