2014-03-03 58 views
0

朋友函數析構指針,我仍然可以用指針訪問類的函數。私有析構函數的朋友函數

#include <iostream> 
using namespace std; 

// A class with private destuctor 
class Test 
{ 
private: 
~Test() 
{ 
cout<<"Inside destructor"<<endl; 
} 

friend void destructTest(Test*); 
public: 
void display() 
{ 
cout<<"I am display func:"<<this<<endl; 
} 
}; 

void destructTest(Test* ptr) 
{ 
cout<<"In here:"<<ptr<<endl; 
delete ptr; 
ptr = NULL; 
} 

int main() 
{ 
    Test *ptr; 
    ptr = new Test; 
    destructTest (ptr); 
    ptr->display();// this gets called properly! 
    return 0; 
} 

指針引用是如何保持的?我甚至試着將這段代碼的某些部分(= new Test())移到另一個函數中,以查看它是否與本地引用相關,但引用保持到程序結束!

只有當我把PTR = NULL,則destructTest通話後,它仍然會調用顯示功能,但給爲0

+7

它被稱爲*未定義的行爲*。它可能似乎有效,但你不能依賴它。與朋友功能完全無關。 – juanchopanza

+0

另外,'destructTest()'中的'ptr = NULL'語句沒有意義,因爲它只修改'ptr'的本地副本,並且不會返回'main()'中的'ptr',仍然保留舊值,而不管對象已被刪除...... – twalberg

回答

2

display()功能實際上沒有訪問任何已分配的內存的內存位置或(現在)刪除。

如果您有一個成員變量並試圖訪問它,程序將更有可能崩潰。

然而,你在這裏做的是未定義的行爲,僅僅因爲你刪除了對象,並不意味着任何內存已經改變,或者它已經或者誰知道,這完全是實現的依賴,你不能依賴它。簡而言之,一旦您取消引用已刪除的指針,包括通過電子郵件發送您的貓,就會發生任何事情。