程序運行發生宕機,原因在註釋中說明。
本例程討論:
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");
}