我想知道是否可以确定给定地址是在堆栈上还是在堆中。我喜欢这个,因为我们使用的引用计数系统有一个缺陷,如果智能指针以某种方式指向堆栈中的对象,就会发生坏事。如果我有这个功能,我可以使用它来提前检测这个错误情况并抛出,这样开发人员就会被迫立即处理这个问题。
答案 0 :(得分:2)
任何解决方案都必须是特定于平台的。在Windows中,您可以使用HeapWalk枚举堆中的所有内存块。在Unix中,您可以尝试使用pthread_attr_getstack()。
答案 1 :(得分:2)
你问题的直接答案是GCC支持内联汇编语言,它可以让你比较指向堆栈指针的指针。
但您可能更喜欢forcing your objects to be heap-allocated,因此您不会首先遇到此问题。
答案 2 :(得分:1)
不,这是不可能或支持。 (好吧,如果你想依赖未定义或实现定义的行为,可能有可能...我强烈建议你不要这样做。)计算机科学课程中教授的堆栈和堆的典型解释与真实系统(使用虚拟内存)的运行方式几乎没有共同之处。
一般来说,这是不值得的。 (如果是,std::auto_ptr
,std::unique_ptr
或boost::shared_ptr
或boost::scoped_ptr
会这样做的话)C和C ++用户通常习惯于使用允许未定义行为的API,如果用户做了一些愚蠢的事。特别是当涉及存储位置(堆栈与免费存储)时。