對象生命週期的管理——深拷貝和淺拷貝

程序運行發生宕機,原因在註釋中說明。

本例程討論:

 1 成員函數爲指針時,拷貝構造函數與"="運算符如何應如何重寫。

 2 如果在調試程序時,程序沒有按照調試者的思路進入某個函數,看起來就像是跳過了這個函數調用語句一樣。

那麼有可能是調用語句沒有滿足調用規則,從而調用了系統的默認函數

#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std ;

class Name
{
public:
	Name(char *myp)
	{
		m_len = strlen( myp ) ;
		m_p = (char *) malloc( m_len + 1 );
		if ( m_p == NULL )
			exit(-1) ;
		strcpy(m_p, myp);
	}

	~Name()
	{
		if ( m_p != NULL )
		{
			free(m_p);
		}
		m_p = NULL ;
		m_len = 0 ;
	}

	Name(const Name &t1 )
	{
		cout<<"拷貝構造函數執行"<< endl;
		m_len = t1.m_len ;
		m_p = (char *) malloc( m_len + 1 );
		if ( m_p == NULL )
			exit(-1) ;
		strcpy(m_p , t1.m_p);
	}

private:
	char *m_p ;
	int m_len ;
};

void objplaymain ()
{
	Name t1("abcdefg") ;  //t1分配了內存
	Name t2 = t1 ;       //執行拷貝構造函數 深拷貝
						 // t2自己malloc了內存
	Name t3("t3");		
	t3 = t1 ;			//執行默認的=操作符 淺拷貝  t3代表了t1的內存

	//對象析構時,後定義的先析構
	//t3先被析構 析構的其實是t1的內存
	//t2被析構 析構的是自己malloc出的內存
	//t1被析構 宕機 因爲t3析構的其實是t1的內存
}

void main()//深拷貝淺拷貝
{
	objplaymain() ;
	cout << "hello..." << endl ;
	system("pause");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章