C++ - 如果我使用 map ,我的对象是否被删除了两次?

标签 c++ memory-leaks

<分区>

我一直在从事 Qt 项目,但在删除 map 中保存的对象时遇到了问题。我准备了一个简单的 C++ 代码来展示我的问题:

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

using namespace std;

    class A 
    {
    public:
        int *tab;

        A()
        {
            tab = NULL;
        }
        ~A()
        {
            if (tab != NULL)
            {
                delete[] tab;
            }
        }
    };

        int main()
        {
            map<string, A> mapa;

            string name = "MyArray";

            A *a = new A;
            a->tab = new int[3];
            a->tab[0] = 1;
            a->tab[1] = 2;
            a->tab[2] = 3;

            mapa[name] = *a;

            delete a;


            system("PAUSE");
            return 0;
        }

关闭程序后我得到: 调试断言失败!

_BLOCK_TYPE_IS_VALID 等..

我的问题是:这是为什么?原因可能是 map 在我退出程序后被删除,并且它包含一个在我关闭程序之前被删除的 A 对象 (a)。但是,我传递的是一个值,而不是地址,这是什么问题?

这个值不是刚刚复制到映射中并保存在某个不同的地址中吗?

最佳答案

是的,你在重复删除。

map 复制它们的元素,而您的类型没有复制构造函数。您实际上是在复制 A你自己 mapa[name] = *a无论如何。

成员指针的归属也很不明确。

遵守三则。理想情况下完全避免手动动态分配; A应该有一个 std::vector<int>相反。

关于C++ - 如果我使用 map ,我的对象是否被删除了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37046959/

相关文章:

c++ - 从 C++ 开始,密码验证器

c++ - 从函数内部的对象 vector 中释放内存

ruby-on-rails - Ruby 和 PostgreSQL 单行模式

ios - 仪器中存在内存泄漏的类

java - jittable 的大小增加是否与 android 上的内存泄漏相关?

delphi - Delphi/DBExpress 的内存泄漏

c++ - DPDK 应用程序可以用 C++ 编写吗?如果可以,是如何完成的?

c++ - 在 Eclipse 中使用 rake 构建 C++ 项目

c++ - 如何在具有大端架构的机器上测试您的代码?

c++ - 解析器 : parsing formulas in template files