在类的构造函数中初始化映射时,如何避免内存泄漏?

法比安

我想map在一个类的构造函数中初始化一个(指向a的指针)我编写的程序可以编译,但由于分段错误而在运行时失败。我可以通过map动态分配内存来解决问题,但会Valgrind通知我有关内存泄漏的信息。如何正确初始化类?

这是一个例子

#include <iostream>
#include <map>
#include <string>
#include <vector>

class MemoryLeak {
   public:
    MemoryLeak(std::vector<std::string>& inp) {
        int i = 0;
        std::map<std::string, int>* tmp = new std::map<std::string, int>;
        for (std::string& s : inp) {
            //(*problem_map)[s] = i++; // Line 12: causes a seg fault
            (*tmp)[s] = i++;
        }
        problem_map = tmp;  // Line 15: memory leak
    }
    std::map<std::string, int>* problem_map;
};

int main() {
    std::vector<std::string> input{"a", "b"};
    MemoryLeak mem = MemoryLeak(input);
    for (auto const& it : *(mem.problem_map)) {
        std::cout << it.first << ": " << it.second << "\n";
    }
    return 0;
}

当我取消注释line 12(并注释掉Line 15)时,程序会编译,但是似乎发生了内存泄漏。有人可以告诉我我做错了吗?一个更合适的构造函数会是什么样子?

马丁·莫特罗尔

对于段错误

problem_map在第12行,您的指针未初始化。这就是段错误的原因。您不需要,tmp您可以执行以下操作:

problem_map = new std::map<std::string, int>;
for (std::string& s : inp) {
    (*problem_map)[s] = i++; 
}

现在,对于泄漏,您有两种选择:

1)添加一个析构函数,一个复制构造函数和一个复制分配运算符(或将其删除)。见规则

class MemoryLeak {
   public:
    ~MemoryLeak() {
        delete problem_map;
    }
    MemoryLeak(const MemoryLeak& ) = delete;
    MemoryLeak& operator=(const MemoryLeak& ) = delete;
    MemoryLeak(std::vector<std::string>& inp) {
        int i = 0;
        problem_map = new std::map<std::string, int>;
        for (std::string& s : inp) {
           (*problem_map)[s] = i++; 
        }
    }
    std::map<std::string, int>* problem_map;
};

2)不存储指针,而是存储地图

class MemoryLeak {
   public:
    MemoryLeak(std::vector<std::string>& inp) {
        int i = 0;
        for (std::string& s : inp) {
            problem_map[s] = i++;
        }
    }
    std::map<std::string, int> problem_map;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何避免在基类初始化器中调用默认构造函数?

来自分类Dev

在构造函数中初始化const char *-会发生内存泄漏吗?

来自分类Java

当类构造函数具有参数时,如何在Java中初始化数组?

来自分类Java

序列化在构造函数中初始化的映射

来自分类Dev

使用初始化列表在构造函数中初始化复杂映射

来自分类Dev

如何在派生类构造函数中初始化基类成员变量?

来自分类Dev

如何初始化具有构造函数的动态类

来自分类Dev

C ++构造函数如何初始化其类的对象?

来自分类Dev

在构造函数中初始化数据时,将逻辑与类分开

来自分类Dev

Java构造函数中类变量的初始化

来自分类Dev

在类构造函数中初始化const向量(C ++)

来自分类Java

在构造函数或声明中初始化类字段?

来自分类Dev

在构造函数中初始化类字段的 Rust 方式

来自分类Dev

在类的构造函数中初始化ifstream变量

来自分类Dev

懒惰初始化中的类构造函数

来自分类Dev

在构造函数中初始化类成员变量

来自分类Dev

在没有构造函数的类中初始化变量

来自分类Dev

使用构造函数初始化类中的指针

来自分类Dev

在类本身中初始化 TypeScript 变量与在构造函数中初始化的区别

来自分类Dev

综合默认构造函数如何初始化已初始化的类成员?

来自分类Dev

Python:如何使用构造函数中的列表初始化类

来自分类Dev

如何使可以使用Typescript中的对象或常规参数构造函数初始化的类?

来自分类Dev

如何在类构造函数中初始化匿名结构?

来自分类Java

如何使用实现父接口的类中的构造函数初始化接口类型的对象?

来自分类Java

如何在空类构造函数中初始化List <E>?

来自分类Dev

如何在类的构造函数中初始化对象的2D向量?(C ++)

来自分类Java

如何在工厂方法中初始化具有多个参数构造函数的类

来自分类Dev

如何从 kotlin 中数据类的构造函数初始化“MutableMap”?

来自分类Dev

如何在派生构造函数中初始化从基类继承的向量

Related 相关文章

  1. 1

    如何避免在基类初始化器中调用默认构造函数?

  2. 2

    在构造函数中初始化const char *-会发生内存泄漏吗?

  3. 3

    当类构造函数具有参数时,如何在Java中初始化数组?

  4. 4

    序列化在构造函数中初始化的映射

  5. 5

    使用初始化列表在构造函数中初始化复杂映射

  6. 6

    如何在派生类构造函数中初始化基类成员变量?

  7. 7

    如何初始化具有构造函数的动态类

  8. 8

    C ++构造函数如何初始化其类的对象?

  9. 9

    在构造函数中初始化数据时,将逻辑与类分开

  10. 10

    Java构造函数中类变量的初始化

  11. 11

    在类构造函数中初始化const向量(C ++)

  12. 12

    在构造函数或声明中初始化类字段?

  13. 13

    在构造函数中初始化类字段的 Rust 方式

  14. 14

    在类的构造函数中初始化ifstream变量

  15. 15

    懒惰初始化中的类构造函数

  16. 16

    在构造函数中初始化类成员变量

  17. 17

    在没有构造函数的类中初始化变量

  18. 18

    使用构造函数初始化类中的指针

  19. 19

    在类本身中初始化 TypeScript 变量与在构造函数中初始化的区别

  20. 20

    综合默认构造函数如何初始化已初始化的类成员?

  21. 21

    Python:如何使用构造函数中的列表初始化类

  22. 22

    如何使可以使用Typescript中的对象或常规参数构造函数初始化的类?

  23. 23

    如何在类构造函数中初始化匿名结构?

  24. 24

    如何使用实现父接口的类中的构造函数初始化接口类型的对象?

  25. 25

    如何在空类构造函数中初始化List <E>?

  26. 26

    如何在类的构造函数中初始化对象的2D向量?(C ++)

  27. 27

    如何在工厂方法中初始化具有多个参数构造函数的类

  28. 28

    如何从 kotlin 中数据类的构造函数初始化“MutableMap”?

  29. 29

    如何在派生构造函数中初始化从基类继承的向量

热门标签

归档