一、你需要一個函數(shù)將一個數(shù)組賦值為等差數(shù)列,并將會在函數(shù)的外部使用它?! ?BR> 不合理:
int *GetArray( int n )
{
int *p = new int[n];
for ( int i = 0; i < n; i++ )
{
p = i;
}
return p;
}
合理:
void GetArray( int *p, int n )
{
for ( int i = 0; i < n; i++ )
{
p = i;
}
}
解析:
檢查內(nèi)存泄露的辦法,就是檢查完全配對的申請和釋放,在函數(shù)中申請而在外部釋放,將導(dǎo)致代碼的一致性變差,難以維護(hù)。而且,你寫的函數(shù)不一定是你自己使用的,這樣的函數(shù)別人會不知道該怎么適當(dāng)?shù)氖褂?,如果它是一個DLL的導(dǎo)出函數(shù),并且你在不同的平臺下使用了,便會導(dǎo)致系統(tǒng)崩潰。的解決辦法就是在函數(shù)調(diào)用的外面將內(nèi)存申請好,函數(shù)只對數(shù)據(jù)進(jìn)行復(fù)制?! ?BR> 二、你需要寫一個類來為你管理一個指針,這個類將封裝對指針的申請內(nèi)存、釋放和其它一些基本操作?!?BR> 不合理:
class A
{
public:
A( void ) {}
~A( void ) { delete []m_pPtr; }
void Create( int n ){ m_pPtr = new int[n]; }
private:
int *m_pPtr;
};
合理:
class A
{
public:
A( void ) : m_pPtr(0){}
~A( void ) { Clear(); }
bool Create( int n ){ if ( m_pPtr ) return false; m_pPtr = new int[n]; return ture; }
void Clear( void ) { delete []m_pPtr; m_pPtr = 0; }
private:
int *m_pPtr;
};
解析:
不合理的代碼就在于當(dāng)你重復(fù)調(diào)用Create的時候就會造成內(nèi)存泄露,解決的辦法就是在new之前判斷一下指針是否為0。要能夠有效的執(zhí)行這個判斷,則必須在構(gòu)造的時候?qū)χ羔樳M(jìn)行初始化,并為這個類添加一個Clear函數(shù)來釋放內(nèi)存?! ?BR> 三、接上題的Create函數(shù),你現(xiàn)在需要根據(jù)傳入的參數(shù)做一些比較復(fù)雜的算法操作,并對申請的數(shù)組賦值?! ?BR> 不合理:
bool Create(int *a, int n )
{
if ( m_pPtr )
return false;
m_pPtr = new int[n];
for ( int i = 0; i < n; i++ )
{
m_pPtr = 3 / a;
}
return true;
}
int *GetArray( int n )
{
int *p = new int[n];
for ( int i = 0; i < n; i++ )
{
p = i;
}
return p;
}
合理:
void GetArray( int *p, int n )
{
for ( int i = 0; i < n; i++ )
{
p = i;
}
}
解析:
檢查內(nèi)存泄露的辦法,就是檢查完全配對的申請和釋放,在函數(shù)中申請而在外部釋放,將導(dǎo)致代碼的一致性變差,難以維護(hù)。而且,你寫的函數(shù)不一定是你自己使用的,這樣的函數(shù)別人會不知道該怎么適當(dāng)?shù)氖褂?,如果它是一個DLL的導(dǎo)出函數(shù),并且你在不同的平臺下使用了,便會導(dǎo)致系統(tǒng)崩潰。的解決辦法就是在函數(shù)調(diào)用的外面將內(nèi)存申請好,函數(shù)只對數(shù)據(jù)進(jìn)行復(fù)制?! ?BR> 二、你需要寫一個類來為你管理一個指針,這個類將封裝對指針的申請內(nèi)存、釋放和其它一些基本操作?!?BR> 不合理:
class A
{
public:
A( void ) {}
~A( void ) { delete []m_pPtr; }
void Create( int n ){ m_pPtr = new int[n]; }
private:
int *m_pPtr;
};
合理:
class A
{
public:
A( void ) : m_pPtr(0){}
~A( void ) { Clear(); }
bool Create( int n ){ if ( m_pPtr ) return false; m_pPtr = new int[n]; return ture; }
void Clear( void ) { delete []m_pPtr; m_pPtr = 0; }
private:
int *m_pPtr;
};
解析:
不合理的代碼就在于當(dāng)你重復(fù)調(diào)用Create的時候就會造成內(nèi)存泄露,解決的辦法就是在new之前判斷一下指針是否為0。要能夠有效的執(zhí)行這個判斷,則必須在構(gòu)造的時候?qū)χ羔樳M(jìn)行初始化,并為這個類添加一個Clear函數(shù)來釋放內(nèi)存?! ?BR> 三、接上題的Create函數(shù),你現(xiàn)在需要根據(jù)傳入的參數(shù)做一些比較復(fù)雜的算法操作,并對申請的數(shù)組賦值?! ?BR> 不合理:
bool Create(int *a, int n )
{
if ( m_pPtr )
return false;
m_pPtr = new int[n];
for ( int i = 0; i < n; i++ )
{
m_pPtr = 3 / a;
}
return true;
}