stl map <char *,char *>析构函数</char *,char *>

时间:2011-12-06 17:39:43

标签: c++ stl

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

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

我无法在/ usr / include / c ++ / 4.4

中看到此代码的位置

编辑: 我应该说

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

喜欢

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

3 个答案:

答案 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超出范围时,此内存将泄漏。

这很好地说明了为什么要避免使用原始指针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";
}

...你得到了真正想要的行为。

答案 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