只在栈上生成对象的类
勘误:在C++语言层面,没有办法实现符合这种要求的类,即使将 new 和 delete 重载为私有,加有限定名字查找 :: ,优先查找全局的 operator new 和 operator delete,重载为私有的就毫无意义。就算把new和delete设置为= delete也不行。详见https://godbolt.org/z/nqs9Gcv6b。
| 1 | 
 | 
vs运行报错,因为 msvc 有限定名字查找有 bug,gcc 和 clang 都可以直接使用。(已编辑)
另外,这个方法根本限制不了在创建静态或线程局部存储期的该类对象。实际下,这些存储期的对象都不在栈上。
在网上学习得知。一些近似的办法,但相当可能不符合题意:
- 完全限制该类的构造函数的访问,使得外部不得构造该类对象,而内部操作只在栈上构造该类对象。
- 生成不可移动或复制的 lambda 表达式闭包类型(需要至少 C++17)。完全符合题目本意的做法基本上是不存在的,除非通过和操作系统交流,在构造函数中确定 this 是否指向系统划定的栈空间。1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11struct Pinned { 
 Pinned() = default;
 Pinned(const Pinned&) = delete;
 Pinned& operator=(const Pinned&) = delete;
 };
 int main()
 {
 auto pinned_lambda = [p = Pinned{}]{};
 // 此后不能在其他地方构造另一个与 pinned_lambda 拥有相同类型的对象
 }
 有疑问或者想更深入了解可以看https://github.com/huihut/interview/issues/112
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 luseYang的妙妙屋!


