GCC是否支持查询堆栈的当前范围?

时间:2010-09-01 22:31:21

标签: c++ stack

我想知道是否可以确定给定地址是在堆栈上还是在堆中。我喜欢这个,因为我们使用的引用计数系统有一个缺陷,如果智能指针以某种方式指向堆栈中的对象,就会发生坏事。如果我有这个功能,我可以使用它来提前检测这个错误情况并抛出,这样开发人员就会被迫立即处理这个问题。

3 个答案:

答案 0 :(得分:2)

任何解决方案都必须是特定于平台的。在Windows中,您可以使用HeapWalk枚举堆中的所有内存块。在Unix中,您可以尝试使用pthread_attr_getstack()。

答案 1 :(得分:2)

你问题的直接答案是GCC支持内联汇编语言,它可以让你比较指向堆栈指针的指针。

但您可能更喜欢forcing your objects to be heap-allocated,因此您不会首先遇到此问题。

答案 2 :(得分:1)

不,这是不可能或支持。 (好吧,如果你想依赖未定义或实现定义的行为,可能有可能...我强烈建议你不要这样做。)计算机科学课程中教授的堆栈和堆的典型解释与真实系统(使用虚拟内存)的运行方式几乎没有共同之处。

一般来说,这是不值得的。 (如果是,std::auto_ptrstd::unique_ptrboost::shared_ptrboost::scoped_ptr会这样做的话)C和C ++用户通常习惯于使用允许未定义行为的API,如果用户做了一些愚蠢的事。特别是当涉及存储位置(堆栈与免费存储)时。