C++中对象的静态和动态内存分配

use*_*177 8 c++

在C++程序中,对于一个类,我们如何获得静态创建和动态创建的任何时间点的活动对象数量?

Bor*_*der 9

可悲的是你不能.斯科特迈耶的其中一本书中有一个完整的部分,他继续讨论试图实现这一目标的挑战,但缺点是它是不可能的.

更有效的C++ - 第27项:要求或禁止基于堆的对象.

好的,这是容易证明的问题之一(有问题的项目有几页,所以我不会总结所有内容,但这里至少有一个挑战):

许多(但不是全部)系统以下列方式排列内存:

----------------
|     Stack    |
| (Grows Down) |
|              |
----------------
|              |
|              |
|              |
|              |
|              |
|              |
----------------
|     Heap     |
|  (Grows Up)  |
|              |
----------------
Run Code Online (Sandbox Code Playgroud)

现在你可能会想到这样的内存安排,你可以通过operator new/new运算符做一些聪明的事情来判断你是在堆上还是不正确(通过检查你是在某个内存位置之上还是之下)?这是问题所在.静态对象的位置取决于系统,因此可能发生以下情况:

----------------
|     Stack    |
| (Grows Down) |
|              |
----------------
|              |
|              |
|              |
|              |
|              |
|              |
----------------
|     Heap     |
|  (Grows Up)  |
|              |
----------------
|    Static    | 
|    Objects   |
----------------
Run Code Online (Sandbox Code Playgroud)

您现在无法区分静态对象和堆对象.哎呀!另外你可能已经注意到我说这是系统相关的,这意味着即使你想出一种方法来区分它们,你的代码也不会是可移植的.

  • @hivert:基本的困难是语言无法告诉对象是如何分配的.您可以使用智能指针跟踪动态对象或重载`operator new/delete`; 但是没有办法区分静态,自动,线程局部和临时对象. (4认同)
  • 你能谈谈这些困难吗? (2认同)