用堆成员删除对象

Deleting objects with heap members

本文关键字:对象 删除 成员      更新时间:2023-10-16

我正在研究BITSet实现。该比特组使用unsigned long long的数组来存储位。

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

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

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 的新手,因此对课堂内的堆栈/堆行为的任何见解都将不胜感激。

您可以使用矢量容器:

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

向量负责记忆分配,因此您不会意外删除内存或意外泄漏内存时不会出现问题。


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