[面试] 编写C++中的两个类 一个只能在栈中分配空间 一个只能在堆中分配 (Very Good! tx)

本文介绍了一种通过声明私有析构函数的方式,确保类的实例仅能在堆上创建的技术。这种方式避免了类实例在栈上的自动销毁,并提供了一个自定义的destroy方法用于手动释放堆上分配的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们规定类只能在堆上分配内存时,就可以将析构函数声明为私有的。

如果在栈上分配空间,类在离开作用域时会调用析构函数释放空间,此时无法调用私有的析构函数。

如果在堆上分配空间,只有在delete时才会调用析构函数。

可以添加一个destroy()函数来释放,从而解决不能在析构函数中添加delete的问题。

/**
//HeapOnly.cpp
#include <iostream>
using namespace std;
class HeapOnly {
public :
    HeapOnly() {
        cout << "Structor." << endl;
    }
    void destroy() const {
        cout << "destructor" << endl;
        delete   this;
    }
private :
    ~HeapOnly() {}
};
int main() {
  HeapOnly *p = new HeapOnly;
  p->destroy();
  // HeapOnly h;
  // h.Output();
  return   0;
}
**/
//StackOnly.cpp
#include <iostream>
using namespace std;
class StackOnly {
public :
    StackOnly() {
        cout << "constructor." << endl;
    }
    ~StackOnly() {
        cout << "destructor." << endl;
    }
private :
    static void* operator new(size_t);
};
int main() {
    StackOnly s;  ///okay
    //StackOnly *p = new StackOnly; ///wrong
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值