zoukankan      html  css  js  c++  java
  • 只能在堆上生成的对象 VS. 只能在栈上生成的对象

    1. 只能在堆上

     即禁止在栈上生成。如何实现?

    当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。如果类的析构函数是私有的,则编译器不会在空间上为类对象分配内存。

    所以,只需把类的析构函数声明为private即可禁止该类在栈上生成对象。但是别忘了提供一个public的函数用于析构。

    1 class A {
    2 public:
    3     A(){}
    4     void destroy() {    
    5         delete this;
    6     }
    7 private:
    8     ~A(){}
    9 };

     

    缺点&follow up: http://blog.csdn.net/szchtx/article/details/12000867

    2. 只能在栈上

     即禁止在堆上生成。

    只有使用new运算符,对象才会建立在堆上。因此,只要禁用new运算符就可以实现类对象只能建立在栈上。因此将运算符new和delete设为private即可。

    1 class A {
    2 public:
    3     A(){}
    4     ~A(){}
    5 private:
    6     void* operator new(size_t size) {} //void*
    7     void operatordelete(void* ptr) {} //void
    8 };

    注意:new运算符的返回值类型是void* , delete的返回值类型是void。别弄错了。

    另外,new的参数是size_t, delete的参数是void*.

    ref1: http://www.nowcoder.com/questionTerminal/0a584aa13f804f3ea72b442a065a7618

    ref2: http://blog.csdn.net/acdnjjjdjkdckjj/article/details/5633611

  • 相关阅读:
    Redis的探究
    白话插件框架原理
    Jquery文本框值改变事件兼容性
    HDU多校练习第一场4608——I_Number
    0-创建scott数据
    句柄和指针
    openssl编译(VC6.0)
    CrashRpt_v.1.4.2_vs2008_also_ok
    文件转换dll mingw
    qt windows分发工具使用(windoployqt)
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4704631.html
Copyright © 2011-2022 走看看