login
欢迎访问QkqBeer博客园!

C++中深浅拷贝问题(构造函数)

构造函数主要分为:默认构造函数和有参构造函数;构造函数又分为:普通的构造函数和copy构造函数(需传入自身的对象)

利用自己定义的构造函数解决浅拷贝所带来的潜在的析构过程中的bug。

改程序中主要是利用重写copy构造函数,通过给对象在自由存储区(堆)重新分配自己的存储空间,来实现深copy,从而避免上述所提到的潜在bug。

 

#include <iostream>
using namespace std;

class Name
{
	public:
		Name(const char *myp)
		{
			m_len = strlen(myp);
			m_p = (char *) malloc (m_len + 1); //给指针分配内容空间
			strcpy(m_p, myp);
			}	
		//Name obj2 = obj1;
		//手动解决拷贝构造函数,使用深copy
		//指针的真正用武之地就是在运行时分配未命名的内存来储存值;c语言中使用malloc来分配,c++使用new运算符
		
		Name(const Name & obj1)
		{
			m_len = obj1.m_len;
			m_p = (char *)malloc(m_len + 1); //给指针分配内容空间
			strcpy(m_p, obj1.m_p);
		 }
		 ~Name()
		 {
		 	if(m_p != NULL)
		 	{
		 		free(m_p);//释放的不是指针,而是指针指向的内容空间,如果是浅拷贝的话,则释放第二次的时候,容易报错。
		 		m_p = NULL;
		 		m_len = 0;
			 }
		 }
	protected:
	private:
		char *m_p;
		int m_len;
};

void objdisplaymain()
{
	Name obj1("abcdefg");
	Name obj2 = obj1; //默认的copy构造函数 C++编译器给我们提供的 
}
//在程序调用结束时,会调用析构函数来回收内存,析构掉obj1和obj2两个对象。根据析构函数的操作,浅拷贝会出现bug
int main()
{
	objdisplaymain();
	cout << "hello..." << endl;
	return 0;
}

 

  

 

  

posted @ 2019-04-17 15:45  BeerQkq  阅读(297)  评论(0编辑  收藏  举报