我知道map析构函数会调用每个包含元素的析构函数。
会发生什么map<char*,char*> ?
我无法在/ usr / include / c ++ / 4.4
中看到此代码的位置编辑: 我应该说
map<const char*, const char*, ltstr>
喜欢
答案 0 :(得分:13)
当map<char*,char*>
被销毁时,它所包含的所有元素也被销毁。如果它是类类型,则调用每个元素的析构函数。
但是,请记住上面地图中包含的内容。它不是字符串,正如您所期望的那样 - 它只是指向字符串的指针。字符串本身不会被破坏。只有指针。永远不会在指针上调用delete
。
案例:
map<char*, char*> strings;
char* key = new char[10];
char* value = new char[256];
/* ... */
strings.insert(key,value);
在上文中,由于delete
从未调用由new
调用创建的指针,因此当strings
超出范围时,此内存将泄漏。
这很好地说明了为什么要避免使用原始指针new
和delete
。在您的情况下,map<string,string>
可能是更好的选择。
编辑:
正如@sbi在评论中提到的那样,你希望map<string,string>
超过map<char*,char*>
的另一个原因是因为map<string,string>
键是按值而不是按指针值进行比较
考虑:
#include <map>
#include <iostream>
#include <string>
using namespace std;
int main()
{
static const char MyKey[] = "foo";
const char bar[] = "bar";
typedef map<const char*,const char*> Strings;
Strings strings;
strings.insert(make_pair(MyKey,bar));
string ss = "foo";
Strings::const_iterator it = strings.find(ss.c_str());
if( it == strings.end() )
cout << "Not Found!";
else
cout << "Found";
}
从根本上说,您要插入一个带有“foo”键的元素,然后搜索该元素。测试上面的代码,你会发现它找不到。但是,如果您尝试这样做:
#include <map>
#include <iostream>
#include <string>
using namespace std;
int main()
{
typedef map<string,string> Strings;
Strings strings;
strings.insert(make_pair("foo","bar"));
string ss = "foo";
Strings::iterator it = strings.find(ss);
if( it == strings.end() )
cout << "Not Found~!";
else
cout << "Found";
}
...你得到了真正想要的行为。
答案 1 :(得分:6)
会发生什么
无。如果你动态分配了内存,它就会泄漏 - char*
没有自动析构函数。
改为使用std::string
或类似的类。
答案 2 :(得分:1)
我同意std::map<string, string>
优于std::map<char*, char*>
。特别是将键作为值而不是指针将提供预期的搜索/查找结果。
但是,当map的值部分是用户定义类的重对象时,有时我们确实需要在值部分中专门用于地图定义中的指针。对于繁重的对象,我的意思是该类的复制构造函数做了大量的工作。在这种情况下,地图的值部分应该是指针。如上所述,使用原始指针会泄漏内存。智能指针是更好的选择,确保没有内存泄露。
示例示例: 考虑下面的课程
class ABCD
{
public:
ABCD(const int ab) : a(ab)
{cout << "Constructing ABC object with value : " << a << endl;}
~ABCD()
{cout << "Destructing ABC object with value : "<< a << endl;}
void Print()
{ cout << "Value is : " << a << endl;}
private:
int a;
};
考虑使用上述类的代码where-in智能指针:
{
std::map<_tstring, std::shared_ptr<ABCD>> myMap;
_tstring key(_T("Key1"));
myMap.insert(std::make_pair(key, std::make_shared<ABCD>(10)));
auto itr = myMap.find(key);
itr->second->Print();
myMap[key] = std::make_shared<ABCD>(20);
itr = myMap.find(key);
itr->second->Print();
} // myMap object is destroyed, which also calls the destructor of ABCD class
以上代码的输出是:
Constructing ABC object with value : 10
Value is : 10
Constructing ABC object with value : 20
Destructing ABC object with value : 10
Value is : 20
Destructing ABC object with value : 20