gpt4 book ai didi

c++ - STL map 析构函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:12 33 4
gpt4 key购买 nike

我知道映射析构函数调用每个包含元素的析构函数。

会发生什么
map<char*,char*> ?

我看不到这段代码在/usr/include/c++/4.4 中的什么地方


编辑:我应该说

map<const char*, const char*, ltstr>

喜欢

http://www.sgi.com/tech/stl/Map.html

最佳答案

map<char*,char*>被摧毁,它包含的所有元素也被摧毁。如果元素是类类型,则调用每个元素的析构函数。

但是,请牢记上面 map 中包含的内容。正如您所料,它不是字符串——它只是指向字符串的指针。琴弦本身并没有被破坏。只有指针是。 delete永远不会在指针上调用。

恰当的例子:

map<char*, char*> strings;

char* key = new char[10];
char* value = new char[256];
/* ... */
strings.insert(key,value);

在上面,由于delete永远不会调用由对 new 的调用创建的指针,此内存将在 strings 时泄漏超出范围。

这很好地说明了为什么应避免使用原始指针,newdelete .在你的情况下,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";
}

...您会得到您真正想要的行为。

关于c++ - STL map<char*,char*> 析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8404260/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com