博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何只在堆上创建对象,如何只在栈上创建对象
阅读量:4198 次
发布时间:2019-05-26

本文共 1314 字,大约阅读时间需要 4 分钟。

如何设计一个类, 使之对象实例只能在堆中创建(new生成)

如何设计一个类, 使之对象实例只能在栈中创建(变量定义)

 

class OnlyStack

{
public:
     OnlyStack(){}
private:
     void* operator new( size_t );
}
int main( int argc, char* argv[] )
{
    OnlyStack stack;                  // OK
    OnlyStack *heap = new OnlyStack;  // Error
}
---------------------------------------------------------------
//禁止在heap
class number
{
   private:
    static void*operator new(size_t size);
    static void operator delete(void*ptr);
  ..........
};
//禁止在栈上
class number
{
   private:
        ~number();
   public:
     void destory()const{delete this;}
   ............
}
---------------------------------------------------------------
限制对象只能创建在堆上是一种比较常见的需求,也有成熟的设计模式。
但是,如何限制对象只能创建在栈上就比较新鲜,好象没有现成的模式可用,想不出用什么方法来做。楼上几位的方法都是有问题的。我倒是有一个方法,但必须用汇编来实现(而且不能用嵌入汇编,只能用汇编直接写一个函数,连接到主程序中,这样的话,必须手工 mangle/demangle new运算符的函数名),这个与平台、编译器紧密相关,算不上是C++的解法。不知诸位大侠有没有更佳的方案?
下面是汇编代码,不过,没试过,呵呵,也不知道各个编译器的具体情况,要做好多假设啊,所以没时间来试。
.386
.model flat
.code
public OverideNewMangledName ; 这里需要知道编译器的重载成员new操作符mangle后的名字
; 这段代码是平台/编译器相关的, 
; 它有许多假定,如假定 new 操作符使用 cdecl 调用约定等等
OverideNewMangledName proc
    POP     EBX     ; 返回地址
    POP     EAX     ; sizeof(MyObject), 这里假定 new 只有一个形参
    SUB     ESP,EAX   ; 在栈中开辟对象存储空间
    MOV     EAX,ESP ; 这里是要返回的对象指针
    SUB     ESP,4   ; 为形参占个位置而已, 保持栈顶为调用前状态
    PUSH    EBX
    RET
OverideNewMangledName endp
; 这里假定返回后编译器会调用对象的构造函数, 这个假定一般倒是成立
END
函数返回后,对象指针被返回,且对象位置在栈顶上。如果把类的构造函数设为私有,就达到了只能在栈上创建的目的了。

转载地址:http://awzli.baihongyu.com/

你可能感兴趣的文章
JAX-RS(java restful实现讲解)(转)
查看>>
Spring MVC与JAX-RS比较与分析
查看>>
openstack官方docker介绍
查看>>
头痛与早餐
查看>>
[转]在ASP.NET 2.0中操作数据::创建一个数据访问层
查看>>
Linux命令之chmod详解
查看>>
【java小程序实战】小程序注销功能实现
查看>>
Java中子类能否继承父类的私有属性和方法
查看>>
JVM内存模型详解
查看>>
(二)Git--工作区和暂存区、管理修改与撤销
查看>>
(七)Git--自定义Git
查看>>
(五)Git--分支管理
查看>>
(四)Git--远程仓库
查看>>
(六) Git--标签管理
查看>>
java中继承,子类是否继承父类的构造函数
查看>>
什么是Spring Cloud ?
查看>>
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>