1,限制类的对象只能生成在栈上

将 operator new 各种原型设为私有

#include <iostream>

class OnlyOnStack {
public:
OnlyOnStack() {
std::cout << "ctor!" << std::endl;
}
~OnlyOnStack() {
std::cout << "dctor!" << std::endl;
}
private:
void* operator new (std::size_t size);
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;
void* operator new (std::size_t size, void* ptr) noexcept;
void* operator new[](std::size_t size);
void* operator new[] (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;
void* operator new[] (std::size_t size, void* ptr) noexcept;
}; int main() {
OnlyOnStack stack; // OnlyOnStack *ps = new OnlyOnStack;
}

2,限制类的对象只能生成在堆上,有两种方法

2.1 使用单例模式:构造函数私有,getInstance()中获取单例时new 出来一个

2.2 析构函数私有,这样编译器就会自动阻止你定义栈上对象,析构函数私有了就需要类提供一个public的销毁函数给外部用

C++如何限制对象在堆上或栈上生成的更多相关文章

  1. go语言的局部变量在堆上还是栈上?

    在讨论之前,先看如下代码: type treeNode struct { value int left, right *treeNode } func createNode(value int) *t ...

  2. C++:在堆上创建对象,还是在栈上?

    这篇文章来自于一次讨论:http://www.devbean.net/2013/01/qt-study-road-2-model-view/#comment-17532.关于究竟是在堆上还是在栈上创建 ...

  3. Java中的栈上分配

    博客搬家自https://my.oschina.net/itsyizu/blog/ 什么是栈上分配 栈上分配是java虚拟机提供的一种优化技术,基本思想是对于那些线程私有的对象(指的是不可能被其他线程 ...

  4. 【深入浅出-JVM】(7):栈上分配

    概念 对那些作用于不会逃逸出方法的对象,在分配内存时,不在将对象分配在堆内存中,而是将对象属性打散后分配在线程私有栈内存上,这样随着方法调用结束,栈上分配打散的对象也被回收掉,不在增加 GC 额外压力 ...

  5. 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结

    堆和栈的区别 一个由C/C++编译的程序占用的内存分为以下几个部分1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.2.堆区(heap ...

  6. 只能在堆上生成的对象 VS. 只能在栈上生成的对象

    1. 只能在堆上 即禁止在栈上生成.如何实现? 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象.如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存. 所以,只需 ...

  7. new 的对象如何不分配在堆而分配在栈上(方法逃逸等)

    当能够明确对象不会发生逃逸时,就可以对这个对象做一个优化,不将其分配到堆上,而是直接分配到栈上,这样在方法结束时,这个对象就会随着方法的出栈而销毁,这样就可以减少垃圾回收的压力. 如方法逃逸. 逃逸分 ...

  8. block存储区域——怎样验证block在栈上,还是堆上

    Block存储区域 首先,须要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...

  9. Java 对象在堆中的内存结构

    翻译人员: 铁锚 翻译日期: 2013年11月8日 原文链接:  What do Java objects look like in memory during run-time? 我们知道,函数每次 ...

随机推荐

  1. 记一些使用mpvue时遇到的问题

    一.在mpvue中使用vuex(和在vue中使用不同) 1.vue中使用vuex,在main.js中: import store from './store' new Vue({ store })   ...

  2. 进程管理工具之supervisor[详解]

    原文链接:https://blog.csdn.net/weixin_42390791/article/details/88866237 一.问题背景1.背景​   如何才能让一个进程摆脱终端,获得相对 ...

  3. javascript原型与原型链个人理解

    想了解原型和原型链,我觉得首先我们得知道javascript里有一个Object 与 Function,它俩都是构造函数,当然函数也是一个对象.我们打印Object 与 Function看一下, co ...

  4. ES6基本常见语法

    特色:写法更加优雅,更加像面像对象的编程,其思想和 ES5 是一致的. 箭头函数.this ES6中可以使用 => 作为函数表达形式,极简风格,参数+ => +函数体. var foo = ...

  5. 本地存储cookie,localStorage,sessionStorage

    常见的前端存储有老朋友 cookie,短暂的 sessionStorage,和简单强大的localStorage 他们之间的区别有以下几点 1.. cookie在浏览器和服务器间来回传递.而sessi ...

  6. LeetCode——全排列

    给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[  [1,2,3],  [1,3,2],  [2,1,3],  [2,3,1],  [3,1,2],  [3 ...

  7. Redhat 7修改主机名

    修改主机名: Linux master2 3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57 EDT 2017 x86_64 x86_64 x86_64 G ...

  8. php自定义json_encode()和json_decode()函数

    json数据大家应该遇到过,json_encode()和json_decode()是php5.0以后加上的内置函数,如果低版本要使用,需加扩展,很多时候我们无权改变服务器的配置,我们只能通过自定义函数 ...

  9. 解决Javaweb中HTTP500的问题

    当我们新建一个Web项目后,运行时可能出现HTTP-500的错误如下图所示  一般是由于路径配置出错 即你电脑上的Tomcat版本与代码本身版本不一致或没有配置路径造成的 解决方法如下 一.鼠标右击你 ...

  10. Linux——awk

    https://blog.csdn.net/jin970505/article/details/79056457 可以根据特定规则输出文本文件内容