读书人

关于STL中MAP的奇怪表现求解惑,该如

发布时间: 2013-10-23 11:39:13 作者: rapoo

关于STL中MAP的奇怪表现,求解惑
废话不说,先上代码


#include "stdafx.h"
#include "windows.h"
#pragma warning(disable: 4786)
#include <string>
#include <map>
class Ctest
{
public:
Ctest(){OutputDebugString("\n 构造");};
virtual ~Ctest(){OutputDebugString("\n 析构");};
int m_nTest;
};

int main(int argc, char* argv[])
{
std::map<int,Ctest> m_TestMap;
m_TestMap[0];
getchar();
getchar();
return 0;
}


运行后得到结果

构造
析构
析构


我所理解的应该只会得到

构造


后面出现两个“析构”是怎么回事,求大能解惑.
[解决办法]
建议你再加上拷贝构造函数、重载=操作符,并打印,再运行一遍你的程序
[解决办法]
不要忽略了拷贝构造
[解决办法]
引用:
我的疑问是我并没有释放,怎么就会执行到析构函数了?
求解释MAP的高深知识

m_TestMap[0]会在平衡树中查找有木有0,发现木有,会构造一个临时对象,这个临时对象在这句分号结尾生命周期结束。同时,在这句话里头还会有拷贝操作,这个你懂的,在树中存在
[解决办法]
引用:

#include "stdafx.h"
#include "windows.h"
#pragma warning(disable: 4786)
#include <string>
#include <map>
class Ctest
{
public:
Ctest(){
OutputDebugString(L"\n 构造");
}
Ctest(const Ctest& t){
OutputDebugString(L"\n 拷贝构造");
}

virtual ~Ctest(){
OutputDebugString(L"\n 析构");
}
int m_nTest;
};
void test(){


std::map<int,Ctest> m_TestMap;
m_TestMap[0];
}
int main(int argc, char* argv[])
{
test();
getchar();
return 0;
}

输出是:
构造
拷贝构造
拷贝构造
析构
析构


你的输出是不完整的,还有一个临时对象没有释放,不可能构造三次,只释放两次;

另外如果要明白为什么,可能真的要看看map的源码的;

一般情况下map中最好别存对象,尤其是带指针成员的对象(否则应该重写拷贝机制,有多种实现方式,比如:引用计数、深拷贝等)和大的对象(拷贝耗时间,效率低下),建议map中存储对象的指针,记得自己清理资源就好。
[解决办法]
如果说初次接入stl,建议先学学语法及使用注意事项,不建议陷入其中,当然如果感觉自己对C++语言的语法(模板、指针等等)和很多算法(map内部使用的是红黑树)都清楚了,可以看看stl源码,否则不太建议看,里面还是有些难度的。

读书人网 >C++

热点推荐