读书人

访问违规的有关问题

发布时间: 2012-05-11 12:55:37 作者: rapoo

访问违规的问题
我的程序简化以后大致是这个样子的:

C/C++ code
class Memory {private:    int mem[1024];public:    void Memory(void) {        memset(mem, 0, sizeof(int) * 1024;    }    int read(int addr) { // 发生错误的位置        return mem[addr];    }}class CPU {private:    int data;    Memory *memorypublic:    void CPU(Memory *mem) {        memory = mem;    }    void fetch(int addr) {        data = memory->read(addr);    }    void loop(void) {        fetch(300);    }}int main() {    Memory *theMemory = new Memory;    CPU *theCPU = new CPU(theMemory);    theCPU->loop();    return 0;}

每次运行到上面标注的地方就发生访问违规错误:
Unhandled exception at 0x010f39fa in Test.exe: 0xC0000005: Access violation reading location 0xcdd44dcd.
我单步调试了程序,在Memory的构造函数里,mem这个数组的确被清零了。但是运行到CPU类里的时候,监视窗口里的mem变成了灰色,表明已经离开变量的作用域。等到fetch()函数再次进入Memory类的read()函数的时候,监视窗口显示mem数组里全都是???,就是没有初始化的样子。之后就发生访问违规错误了。

有谁知道这是怎么回事吗?非常感谢!

[解决办法]
void Memory(void)
void CPU(Memory *mem)
是构造函数吧, 不该有返回值的,
这样应该不能编译通过吧。

[解决办法]
你这构造函数怎么还有void呢。
[解决办法]
构造函数格式错了.
C/C++ code
class Memory {private:    int mem[1024];public:    Memory() {        memset(mem, 0, sizeof(int) * 1024);    }    int read(int addr) { // 发生错误的位置        return mem[addr];    }}class CPU {private:    int data;    Memory *memorypublic:    CPU(Memory *mem) {        memory = mem;    }    void fetch(int addr) {        data = memory->read(addr);    }    void loop(void) {        fetch(300);    }}int main() {    Memory *theMemory = new Memory;    CPU *theCPU = new CPU(theMemory);    theCPU->loop();    return 0;}
[解决办法]
探讨

哦,我改写的时候错了。程序能通过编译,构造函数没有void.

读书人网 >C++

热点推荐