C++ new map erase delete 不delete时候重复使用问题 各种情况测试代码

#include <iostream>

#include <map>

using namespace std;

#include <stdio.h>

struct A
{
    int x;
    int y;

    A(int v1, int v2) : x(v1), y(v2) {}
};

class B
{
    public:
/*
 * 情况1
 * 带指针 通过new操作 带引用
 * 输出: 正常输出
 * 注意:erase 或者delete操作注意释放
 * */
void push(std::map<int, A*>& _a)
{
    A* a1 = new A(10, 20);
    _a.insert(std::make_pair(10, a1));

    A* a2= new  A(1,2);
    _a.insert(std::make_pair(3, a2));

    A* a3= new A(4,2);
    _a.insert(std::make_pair(5, a3));

}

/*
 * 情况2
 * 带指针 不通过new操作 直接在函数内取地址
 * 输出:不正常
 * 原因:函数结束后 临时栈地址释放掉
 * */
void pushx()
{
    A a1 = A(10, 20);
    _a.insert(std::make_pair(10, &a1));

    A a2= A(1,2);
    _a.insert(std::make_pair(3, &a2));

    A a3= A(4,2);
    _a.insert(std::make_pair(5, &a3));

}

/*
 * 情况3
 * 不带指针
 * 输出:正常
 * inert 操作 相当于复制操作
 * */
void pushxa(std::map<int, A>& _aa)
{
    A a1 = A(10, 20);
    _aa.insert(std::make_pair(10, a1));

    A a2= A(1,2);
    _aa.insert(std::make_pair(3, a2));

    A a3= A(4,2);
    _aa.insert(std::make_pair(5, a3));

}

/*
 * 和情况2类似
 * 区别 带引用
 * */
void pushx(std::map<int, A*>& _a)
{
    A a1 = A(10, 20);
    _a.insert(std::make_pair(10, &a1));

    A a2= A(1,2);
    _a.insert(std::make_pair(3, &a2));

    A a3= A(4,2);
    _a.insert(std::make_pair(5, &a3));

}

void cout()
{
    for(std::map<int, A*>::iterator it = _a.begin(); it != _a.end(); ++it)
    {
        printf("first==>%d \t second==> %d \t %d\n", it->first, it->second->x, it->second->y);
    }

    printf("AAAAAAAAAA\n");
    for(std::map<int, A>::iterator it = _aa.begin(); it != _aa.end(); ++it)
    {
        printf("first==>%d \t second==> %d \t %d\n", it->first, it->second.x, it->second.y);
    }

}

void erase()
{
    std::map<int, A*>::iterator it = _a.find(5);
    if(it == _a.end())
    {
        printf("not found\n");
        return;
    }

    A* a = it->second;
    if(it->second != NULL)
    {
        //delete(a);
    }
    _a.erase(it);
    it->second = NULL;
    printf("delete a==> a->x%d\t a->y%d\n",a->x,a->y);

    /*
     * 当new之后不进行delete后还可以继续作为新的A*进行插入数据
     * */
    //new
    _a.insert(std::make_pair(12,a));

}

B() {
    //pushx(_a);
    //pushx();
    //pushxa(_aa);

    push(_a);
    cout();
    erase();
    cout();
}

private:
    std::map<int, A*> _a;
    std::map<int, A> _aa;
};


int main()
{
    B b;
    return 0;
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值