访问违规,无法弄清楚原因

时间:2014-10-29 11:49:08

标签: c++

所以,正在构建这个类:

public class BitArray {
public:
    unsigned char* Data;
    UInt64 BitLen;
    UInt64 ByteLen;

private:
    void SetLen(UInt64 BitLen) {
        this->BitLen = BitLen;
        ByteLen = (BitLen + 7) / 8;
        Data = new unsigned char(ByteLen + 1);
        Data[ByteLen] = 0;
    }

public:
    BitArray(UInt64 BitLen) {
        SetLen(BitLen);
    }

    BitArray(unsigned char* Data, UInt64 BitLen) {
        SetLen(BitLen);
        memcpy(this->Data, Data, ByteLen);
    }

    unsigned char GetByte(UInt64 BitStart) {
        UInt64 ByteStart = BitStart / 8;
        unsigned char BitsLow = (BitStart - ByteStart * 8);
        unsigned char BitsHigh = 8 - BitsLow;

        unsigned char high = (Data[ByteStart] & ((1 << BitsHigh) - 1)) << BitsLow;  
        unsigned char low = (Data[ByteStart + 1] >> BitsHigh) & ((1 << BitsLow) - 1);

        return high | low;
    }

    BitArray* SubArray(UInt64 BitStart, UInt64 BitLen) {
        BitArray* ret = new BitArray(BitLen);
        UInt64 rc = 0;

        for (UInt64 i = BitStart; i < BitLen; i += 8) {
            ret->Data[rc] = GetByte(i);
            rc++;
        }

        Data[rc - 1] ^= (1 << (BitLen - ret->ByteLen * 8)) - 1;

        return ret;
    }

};

刚刚完成编写SubArray函数并继续测试但我得到了#34;访问冲突:尝试读取受保护的内存&#34;在GetByte(i)被调用的行上。我测试了一下,它似乎与数据数组或i无关,放置&#34; int derp = GetByte(0)&#34;在函数的第一行产生相同的错误。

从课外调用GetByte工作正常,我不明白最新情况。

测试函数如下所示:

        unsigned char test[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
        BitArray* juku = new BitArray(test, 64);

        auto banana = juku->GetByte(7); //this works fine
        auto pie = juku->SubArray(7, 8);

1 个答案:

答案 0 :(得分:2)

您可能需要考虑创建一个数组字符,更改:

Data = new unsigned char(ByteLen + 1);

成:

Data = new unsigned char[ByteLen + 1];

在前者中,括号内的值所需的长度,它是*Data初始化的值。如果使用65(在ASCII系统中),则第一个字符变为A

话虽如此,C ++已经 一个非常高效的std::bitset,对于你似乎处于的情况。如果你的目的是学习如何创建类,那么一定要写你自己。但是,如果你想让自己的生活变得简单,你可能需要考虑使用已经提供的设施,而不是自己动手。