私有析构函数好友函数
private destructor friend function
>Friend 函数破坏指针,但我仍然可以使用指针访问类的函数。
#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。
您的display()
函数实际上并没有访问任何已分配或(现在)删除的内存。
如果您有一个成员变量并尝试访问它,则程序更有可能崩溃。
然而,你在这里做的是未定义的行为,仅仅因为你删除了对象,并不意味着任何内存都改变了它以前的位置,或者它可能已经发生了,或者谁知道,这完全依赖于实现,你不能依赖它。简而言之,一旦您取消引用已删除的指针,任何事情都可能发生,包括向您的猫发送电子邮件。
相关文章:
- 好友函数的工作原理
- 好友库函数可以访问子数据
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 复制和移动构造函数是自动好友吗?
- 好友成员函数可以在单独的文件中使用吗?
- 是 C++ gcc HEAD 10.0.0 20190 相对于好友函数的错误吗?
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 如何在 OSX 上将静态C++函数声明为好友
- 好友函数上的模板链接器错误
- 如何使 lambda 函数成为类的好友
- 私有析构函数好友函数
- 模板好友函数重载
- 好友和静态成员函数具有什么样的成员访问权限
- C++好友模板函数-minGW错误,但不是VS2015
- 非好友、非成员函数增加了封装
- 某些好友函数不遵循规则
- 为什么我不能使这个成员函数成为另一个类的好友?
- C++中的好友函数
- 尝试以好友身份重载流时无法访问<<成员函数?
- 使用好友和成员函数的运算符重载