2014-03-03 55 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()功能实际上没有访问任何已分配的内存的内存位置或(现在)删除。

如果您有一个成员变量并试图访问它,程序将更有可能崩溃。

然而,你在这里做的是未定义的行为,仅仅因为你删除了对象,并不意味着任何内存已经改变,或者它已经或者谁知道,这完全是实现的依赖,你不能依赖它。简而言之,一旦您取消引用已删除的指针,包括通过电子邮件发送您的猫,就会发生任何事情。