私有析构函数的作用

本文通过几个示例展示了如何使用C++中的私有析构函数来防止类实例作为全局变量或堆栈变量被创建。同时介绍了如何通过成员函数安全地删除私有析构函数所属的对象。

#include <iostream>
using namespace std;

class Base
{
public:
 int i ;
private:
 virtual ~Base() {

 }
};

Base gb;
void main()
{
    Base b; 
}

 

K:/Code Boost/PrivateDestructor.cpp(14): error #373: "Base::~Base()" is inaccessible
  Base gb;
              ^
K:/Code Boost/PrivateDestructor.cpp(17): error #373: "Base::~Base()" is inaccessible
      Base b;
                 ^ 

起作用就是阻止产生stack变量或者全局变量

-------------

#include <iostream>
using namespace std;

class Base
{
public:
 int i ;
private:
 virtual ~Base() {

 }
};


void main()
{
    Base * b = new Base;
 delete b;
}

error #373: "Base::~Base(unsigned int)" is inaccessible
   delete b;
                ^

--------------------

#include <iostream>
using namespace std;

class Base
{
public:
 int i ;
 void Release() {
  delete this;
 }
private:
 virtual ~Base() {
       cout<<"Des"<<endl;
 }
};


void main()
{
    Base * b = new Base;
 b->Release();      //Output  : Des
}

 

 

### 析构函数作用 析构函数的主要作用是在对象销毁时执行必要的清理操作。它是一个特殊的成员函数,名称与类名相同但在前面加了一个波浪号 `~`[^3]。它的主要职责是释放对象所占用的资源,例如关闭文件、释放动态内存或解除网络连接等。 #### 清理资源 析构函数通常用于释放对象持有的资源。这些资源可能包括但不限于: - 动态分配的内存(通过 `new` 或 `malloc` 分配的内存) - 文件句柄 - 数据库连接 - 网络套接字 当对象离开其作用域时,编译器会自动调用析构函数来完成上述清理工作[^2]。 #### 控制对象生命周期 析构函数还可以用来控制对象的生命周期。例如,在某些情况下可以通过将析构函数设为私有来防止对象被随意销毁[^1]。这种设计模式常用于单例模式或其他需要严格控制对象数量的情况。 --- ### 使用场景 以下是几个常见的析构函数使用场景: #### 1. **释放动态分配的内存** 如果一个类中包含了指针成员变量,并且该指针指向了一块动态分配的内存,则应在析构函数中释放这块内存以避免内存泄漏。 ```cpp class MyClass { public: int* data; MyClass(int size) : data(new int[size]) {} ~MyClass() { delete[] data; } // 析构函数负责释放动态分配的内存 }; ``` #### 2. **关闭打开的文件或流** 对于持有文件描述符或输入/输出流的对象,可以在析构函数中确保文件被正确关闭。 ```cpp class FileHandler { private: FILE* filePtr; public: FileHandler(const char* filename, const char* mode) { filePtr = fopen(filename, mode); } ~FileHandler() { fclose(filePtr); } // 自动关闭文件 }; ``` #### 3. **断开数据库或网络连接** 在网络编程或数据库应用中,析构函数可用于确保在对象销毁时断开连接。 ```cpp class DatabaseConnection { private: ConnectionHandle handle; public: DatabaseConnection() { /* 初始化连接 */ } ~DatabaseConnection() { disconnect(handle); } // 断开数据库连接 }; ``` #### 4. **日志记录** 有时希望在对象销毁时记录一些调试信息或统计结果,这时也可以利用析构函数。 ```cpp class Logger { public: ~Logger() { std::cout << "Object destroyed\n"; } // 记录对象销毁的时间点 }; ``` --- ### 特殊注意点 - **不可重载**:析构函数不允许带有任何参数,因此无法对其进行重载[^5]。 - **不能返回值**:析构函数没有任何返回类型,甚至不需要声明为 `void`[^3]。 - **隐式调用**:大多数情况下,析构函数会被编译器自动调用,无需程序员显式调用[^2]。 - **虚析构函数**:为了支持多态行为,基类应提供虚析构函数以便子类能够正确地释放资源[^3]。 --- 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值