使用vector容器存储动态申请内存变量的注意事项

初次接触vector的同学可能会因为方便而放弃使用new/delete、malloc/free等动态内存申请方式,当需要用到一个不确定空间大小的变量时,可以直接定义

vector<int> vecINum;
vector<vector<char>> vecCName;
vector<MyClass> vecMC;

然后通过push_back/pop_back等操作动态增加数据。

然而使用过程中如果涉及到动态内存申请,就需要注意以下的情况:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<char*> vec_c;
	for(int i = 0; i < 2; i++)
	{
		char* ch = new char(5);
		strcpy(ch, "haha");
		vec_c.push_back(ch);
		delete ch;
	}
	cout<<vec_c[0]<<endl;//错误,内存已释放
	return 0;
}
如上,当指针变量ch在一次循环后通过delete得到释放,vec_c中存储的指针所指向的内存区域也就释放了。正确做法是将delete ch;这句去掉,然后释放的任务交给vector来完成(vec_c.clear())。

当类中存在动态申请内存的成员变量时:

#include <iostream>
#include <vector>

using namespace std;

class MyClass
{
public:

	MyClass()
	{
		p = NULL;
	}

	/*MyClass(const MyClass& mc)
    <span style="white-space:pre">	</span>{
		strLength = mc.strLength;//注意类内直接访问私有成员变量,编译通过
		char* temp = new char(strLength);
		p = temp;
    <span style="white-space:pre">	</span>}*/

	void SetSpace(int num)
	{
		p = new char(num);
		strLength = num;
	}

	char* GetStr()
	{
		return p;
	}

	int GetStrLength()
	{
		return strLength;
	}

	~MyClass()
	{
		if(p)
			delete p;
	}
private:
	char* p;
	int strLength;
};


int main()
{
	vector<MyClass> vecMC;
	for(int i = 0; i < 2; i++)
	{
		MyClass mc;
		mc.SetSpace(5);
		vecMC.push_back(mc);
	}
	return 0;
}
当程序执行到vecMC.push_back(mc);时会自动调用拷贝构造函数,如果没有则调用默认拷贝构造函数,实现的是浅拷贝,也就是说当当前循环执行结束后,mc中的指针p所指向的内存会释放,因此程序会报错。若想实现该程序的功能就必须重写拷 贝构造函数MyClass(const MyClass& mc),即程序中注释的部分,来实现深拷贝。同样,释放的任务交给vector来完成。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值