我希望能够在运行时确定指针是否在堆栈上,原因有很多.就像我将它传递给函数调用一样,我可以确定是否需要克隆它.或者我是否需要删除它.
在Microsft C(VC 6,7,8)中,是否有一种方法可以检查指针,看它是否在堆栈中?我只关心在拥有该对象所在堆栈的线程上确定这一点.
就像是
static const int __stack_size和__stack_top
???? 谢谢!
知道对象是否在堆栈或堆上并不会告诉您是否应该通过被调用函数克隆或删除它.毕竟,您可以克隆任何一种类型,虽然您不应该尝试删除堆栈分配的函数,但您也不应该尝试删除所有堆指针.
有一个函数可以进行一些奥术检查以确定它是否应该删除传递的指针,这将导致混乱.您不希望出现这样的情况,即您可能会或可能无法引用您传递的对象中的字段,具体取决于上下文.您也不想冒险尝试释放堆栈对象的错误.
没有任何标准方法可以告诉指针指向什么,并且任何非标准方式都可能会破坏.您不能指望堆栈连续性,特别是在多线程应用程序中(有人可以轻松地将一个线程添加到应用程序而不会意识到后果).
唯一安全的方法是有一个调用约定,被调用的函数将删除或不删除传递的对象,或传递某种智能指针.别的什么都在惹麻烦.
有趣的问题.
这是关于如何确定它的想法,但不是函数调用.在堆栈上的应用程序的最开始创建一个虚拟变量.在函数isOnStack(void*ptr)中在堆栈上创建变量检查'ptr'是否在虚拟变量和局部变量之间.
请记住,堆栈对于给定的线程是连续的.我不确定当你从一个线程开始检查这个信息时会发生什么.
如果它不在堆栈中,那么它必须在堆上.
执行此操作取决于函数的调用约定。一些调用约定将参数放置在寄存器中,其他调用约定将它们放置在堆栈头部之后的内存中。每一项都是调用者/被调用者之间的不同协议。因此,在堆栈中的任何函数边界,都可以使用不同的约定。这迫使您跟踪每个级别使用的调用约定。
例如,在 fastcall 中,可以通过寄存器传递一个或多个参数。 有关更多信息,请参阅 MSDN。这会扰乱任何确定地址是否存在于特定范围内的方案。在MS的thiscall中,this指针是通过寄存器传递的。&this 不会解析为堆栈开始和结束之间的值范围之间的某个位置。
最重要的是,研究调用约定,它指定如何布局堆栈内存。这是一个很好的教程
请注意,这是非常特定于平台的!
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |