vector中push_back时候对C++指针的运用

       我们都知道指针用完了必须释放掉,不然会产生内存泄漏,但是得注意一个问题。

       https://www.cnblogs.com/uniqueliu/archive/2011/07/18/2109778.html
       上面这个博客写的很清晰,当用了一个指针 p,如果只用 delete p 来释放的话,系统只会将 p 指向的内存地址删除掉,p本身并不会被删除或是释放。所以 delete p 完了以后可以 p = NULL 来进行对指针 p 的释放。

       int* p = new int(1);  
       通过这样定义一个指针的话,是在堆上分配一个内存存放int类型的数据,并初始化为1,并在栈上分配一个内存给p,并且p的值是堆上那个内存的地址。

       使用指针的时候记得一定要*p这样使用,这样才能读取到指向的地址上的内容。可以用局部变量来初始化一个指针,例如:

	vector<int*> pInt;
	for (int i = 0; i < 10; i++)
	{
		int *a = new int;
		*a = i;
		pInt.push_back(a);
	}

但是在这里并不能用 i 来进行

        pInt.puss_back(i); 

不能这么操作,因为 i 在这个循环中只有一个地址,那么push进去的所有值都指向这同一个地址,修改一个就会全部都一起变。这里不能 delete a; ,因为delete删除的是a指向的地址上的变量,选择pInt的每个元素都指向了他们,删除了也将没了,只会变成随机数。

    vector<int*> pInt;	
    for (int i = 0; i < 10; i++)
	{
		int a;
		a = i;
		pInt.push_back(&a);
	}

这样做也是不行,这样的话跟直接把 i 给 pInt 中 push 进去是没有区别的,a在定义时候初始化为 i 也是一样的。但是为什么会这样呢?输出了一些信息之后发现,此时 a 和 i 的地址是不一样的,但是!a 每次的地址都是一样的,所以第二次循环定义一个 a 对他进行赋值操作时候先前push进去的 a 的也是会一起变得,因为是同一个地址。所以这种情况下还是自己去分配内存进行内存管理比较好。

       所以现阶段我自己能想到的最好的办法是自己分配内存,然后用完了以后如果需要释放内存就先释放内存,然后让指针指向NULL,如果不需要,那块地址已经有别人接管了,那就让之前那个指针直接指向NULL就可以了。如下:

	vector<int*> pInt;
	for (int i = 0; i < 10; i++)
	{
		int *a = new int;
		*a = i;
		pInt.push_back(a); 
		a = NULL;
	}

       通过这个例子还能看出一个事情,就是,vector他push_back时候并不是将a拿过来插进去了,而是新开辟了一个内存,把a的值赋给新开辟的内存,也就是pInt[0]。(毕竟vector它说白了是数组,并不是链表,所以他的内存地址是连续的,不可能把一个随随便便的a加进来,链表的话还能理解)

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值