如何正确地解除分配std::map的内存 P>我需要释放内存,以避免内存泄漏,因为C++使用了新的./P>创建的键和值。

如何正确地解除分配std::map的内存 P>我需要释放内存,以避免内存泄漏,因为C++使用了新的./P>创建的键和值。,c++,memory-management,memory-leaks,C++,Memory Management,Memory Leaks,编写同一段代码的正确而安全的方法是使用std::string。这样,内存分配是在幕后完成的,您不必自己释放内存。按照@PaulMcKenzie的建议,使用 std::map<std::string, std::string> mp; mp.insert({"abc", "pqr"}); 然而,我知道在生产中,某些代码并不容易重构,您可能需要处理您必须处理的内容,以避免插入更多的bug。下面是释放已分配内存的注释代码 int main() { std::map<char

编写同一段代码的正确而安全的方法是使用std::string。这样,内存分配是在幕后完成的,您不必自己释放内存。按照@PaulMcKenzie的建议,使用

std::map<std::string, std::string> mp;
mp.insert({"abc", "pqr"});
然而,我知道在生产中,某些代码并不容易重构,您可能需要处理您必须处理的内容,以避免插入更多的bug。下面是释放已分配内存的注释代码

int main()
{
    std::map<char*, char*> *mp = new std::map<char*, char*>;
    //char *a = new char; // Do not allocate memory here since 'a' will point to a
    a = (char*)"abc";     // string literal and loose track of it's allocated memory
    //char *b = new char
    b = (char*)"pqr";
    mp->insert(std::pair<char*, char*>(a, b));
    a = NULL , b = NULL; // no extra pointers to keys now //

    printf("element : %s", (*mp)["abc"]);

    delete mp ;

    // You don't need to delete the keys/values because we
    // avoided allocating memory for it in the first place
}

此外,在使用char*作为std::map的键值时需要小心,因为没有comparator,它会比较指针,而不是字符串。

使用new创建的键和值–为什么?使用std::strings。定义和初始化后对a和b的赋值都是泄漏内存。char*a=新字符;a=字符*abc;–在这里,您首先分配一个字符,然后用字符串文本abc的地址覆盖分配的内存地址,从而导致内存泄漏。如果您希望在使用赋值运算符之前将abc复制到使用new分配的内存中,则=您错了。您只分配指针,不复制指向的数据。要复制c字符串,请使用std::strcpy。此外,新字符;仅为一个字符分配内存,但字符串abc的长度为4个字符。3个字符+1个终止'\0'字符。std::map mp;mp.插入{abc,pqr};-你写的所有代码只是为了做那一行?在这一行中没有内存泄漏的问题。在这样的任务中使用new是很麻烦的。您使用new是因为您认为它是编写这样的代码的正常方式吗?我担心你是在寻求帮助来养成坏习惯。
int main()
{
    std::map<char*, char*> *mp = new std::map<char*, char*>;
    //char *a = new char; // Do not allocate memory here since 'a' will point to a
    a = (char*)"abc";     // string literal and loose track of it's allocated memory
    //char *b = new char
    b = (char*)"pqr";
    mp->insert(std::pair<char*, char*>(a, b));
    a = NULL , b = NULL; // no extra pointers to keys now //

    printf("element : %s", (*mp)["abc"]);

    delete mp ;

    // You don't need to delete the keys/values because we
    // avoided allocating memory for it in the first place
}