模板类map插入一个自定义类对象遇到问题 求解
项目中要用到map,键为CString 值为自定义类 CFileAttribute ,在使用中遇到了以下问题,求解!!
问题一:
以下两种定义方式,在进行map.clear()的时候,内存释放上有啥不同?
typedef map<CString,CFileAttribute> MAPStr2FileAttr;
typedef map<CString,CFileAttribute *> MAPStr2FileAttr;
我是这样理解的
clear()相当于earse(m.begin(), m.end());
map<CString,CFileAttribute>:
这种方式下存入map的是副本,而不是要添加的对象本身。对象原件在副本拷贝存放结束后便可以结束生命。而在使用clear()的时候,对象副本会去走到析构函数,进行内部的内存释放。clear()后,对象拷贝被析构,剩下的只是raw memory,即没有被初始化的内存,它们将被归还到stl的内存分配器alloc里的,容器本身已经不再拥有这块内存了。
map<CString,CFileAttribute *>:
这时一般不能采用clear()函数,因为存入的是指针,这个指针指向一块区域(new出来的,eg:CFileAttribute *a = new CFileAttribute()),虽然在clear的时候这个指针指向的对象析构了,但是指针本身指向的new的空间还是没有被释放的,所以需要配合delete把这个指针指向的空间释放掉。
我的理解对吗????
问题二:
我采用map<CString,CFileAttribute> 这种方式,既map的value值为CFileAttribute对象,
但是在进行insert的时候程序却报错:
typedef map<CString,CFileAttribute> MAPStr2FileAttr;
MAPStr2FileAttr m_mapKeyVsFile;
szFilePath = "abc";
CFileAttribute FileAttr;
FileAttr.m_str = "nidfjasdkljfsdk";
m_mapKeyVsFile.insert(pair <CString,CFileAttribute> (szFilePath, FileAttr));
在执行insert的时候提示 _BLOCK_TYPE_IS_VALID 的错误,从网上查了下发现把CFileAttribute 的析构函数弄掉就OK了...
这是为什么呢??不是存入map的是原对象的副本吗,怎么还会涉及到析构函数??
问题三:
我在去掉析构函数后继续往下走
//srcfileAttribute.nIndex初始为0
CFileAttribute srcfileAttribute = m_mapKeyVsFile[“abc”];
srcfileAttribute.nIndex++;
但是再次
CFileAttribute srcfileAttribute = m_mapKeyVsFile[“abc”];
发现这个srcfileAttribute.nIndex还是0;并没有变成1,
这是为什么呢???
难道说我不能这样直接改map里面的value值吗?必须删除重新insert一个??
请各位大牛赐教~~谢谢~~!