我是C++的新手,在正在编写的类中正确使用映射时遇到了问题。基本上,当我在一个测试程序中创建一个新的Block对象并调用它的写入方法时,该程序完全不合格,给我一个双重释放或损坏错误。奇怪的是,如果我在Block构造函数中取消注释一行,那么一切正常。我猜我缺少一些基本的C++知识,但我在google上找不到任何有用的东西。我在做什么错误的c + +地图? (可怕的内存错误)
Block.h(包括不显示,但它们的存在):
namespace SSDSim{
class Block{
public:
Block(uint block_num);
~Block(void);
void read(uint page_num);
void write(uint page_num, void *data);
void erase(void);
private:
uint block_num;
std::map<uint, void *> page_data;
};
}
Block.cpp:
#include "Block.h"
using namespace std;
using namespace SSDSim;
Block::Block(uint block){
//page_data[4]= (void *) 0xfeedface;
block_num= block;
}
...
void Block::write(uint page_num, void *data){
if (page_data.find(page_num) == page_data.end()){
page_data[page_num]= data;
} else{
cerr<<"Invalid write\n";
exit(1);
}
}
TEST.CPP:
#include <iostream>
#include "../Block.h"
using namespace std;
using namespace SSDSim;
int main(void){
Block b= Block(0);
b.write(0, (void *) 0xdeadbeef);
b.read(0);
// b.read(4);
return 0;
}
只是一个挑剔,但你应该避免使用诸如“../Block.h”的相对路径。当代码被移动或稍后有人来阅读代码时,这最终导致很多麻烦。将路径相对于存储库根目录相对较好通常会更好。大多数编译器允许您将位置添加到包含搜索路径。有了gcc,你可以使用-Ipath/to/root,然后让include文件引用相对于该位置的内容。 – 2010-06-21 17:28:39
'Block :: read'和'Block'的析构函数是做什么的? – 2010-06-21 17:31:22
你正在使用'void *',这很可怕... – 2010-06-21 19:04:56