• 只能在堆上生成的对象 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

  • 相关阅读:
    B1009
    (OK)(OK) [android-x86-6.0-rc1] compile_Android-x86_64_in_IBM-X3650-M4.txt
    Fortran, Matlab, Octave, Scilab计算速度比较
    GNU Octave
    [android-x86-6.0-rc1] /system/etc/init.sh
    [android-x86-6.0-rc1] /system/xbin/log.sh
    Android源码学习之接着浅析SystemServer
    Android源码学习之浅析SystemServer脉络
    Android-x86_64
    Android-x86_64
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4704631.html
Copyright © 2020-2023  润新知