如何在iOS上检查指针是否指向堆或堆栈内存
How to check a pointer is pointing heap or stack memory on iOS?
这与另一个问题类似,无论如何,如果iOS上存在,我正在寻找一种特定于平台的方法来做到这一点。
为苹果平台开发意味着非基于苹果的工具集通常不太适用。所以我希望找到平台原生的方式来做到这一点。因为简单的谷歌搜索给了我这个(heap
命令),我确信还有一个API函数。
我只为调试构建断言寻找这个,以检测删除堆栈分配对象的情况。所以知道地址指向哪里就足够了——栈还是堆。因此,性能、版本兼容性、内部API或任何质量问题都无关紧要。(也许在模拟器上测试也是一种选择)但我认为,如果堆栈和堆完全分离,这并不是一个繁重的操作。
我标记了C++,但如果API适用于C++,那么任何其他语言中的API也可以。
如果你在iOS上使用GNU GCC编译器和glibc
,那么我相信你可以使用mprobe()
——如果它失败,那么内存块要么已损坏,要么是堆栈内存块。
http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html
更新了操作系统可移植堆检测的帖子:
否则,您可以通过重写new()
&delete()
,记录所有堆内存分配/释放,然后添加自己的堆检测功能;示例如下:
// Untested pseudo code follows:
//
#include <mutex>
#include <map>
#include <iostream>
std::mutex g_i_mutex;
std::map<size_t, void*> heapList;
void main()
{
char var1[] = "Hello";
char *var2 = new char[5];
if (IsHeapBlock(&var1))
std::cout "var1 is allocated on the heap";
else
std::cout "var1 is allocated on the stack";
if (IsHeapBlock(var2))
std::cout "var2 is allocated on the heap";
else
std::cout "var2 is allocated on the stack";
delete [] var2;
}
// Register heap block and call then malloc(size)
void *operator new(size_t size)
{
std::lock_guard<std::mutex> lock(g_i_mutex);
void *blk = malloc(size);
heapList.Add((size_t)blk, blk);
return blk;
}
// Free memory block
void operator delete(void *p)
{
std::lock_guard<std::mutex> lock(g_i_mutex);
heapList.erase((size_t)p);
free(p);
}
// Returns True if p points to the start of a heap memory block or False if p
// is a Stack memory block or non-allocated memory
bool IsHeapBlock(void *p)
{
std::lock_guard<std::mutex> lock(g_i_mutex);
return heapList.find((size_t)p) != heapList.end();
}
void *operator new[] (size_t size)
{
return operator new(size);
}
void operator delete[] (void * p)
{
operator delete(p);
}
相关文章:
- 为什么调用堆栈数组会导致内存泄漏
- 为什么堆栈和堆在内存中分离得如此之多?
- c++ 动态内存 堆栈中的分配
- 巨大的内存分配:堆栈与堆
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 使用一个内存集数组和单个堆栈在 O(n) 中查找数组的下一个更大元素
- 唯一指针是否在堆或堆栈上分配内存?
- 清除在 main() 中分配的堆栈内存?
- 如何以编程方式区分在内存的堆和堆栈部分创建的对象
- 其他线程堆栈上的可用内存无效
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- C++堆栈内存管理问题
- 为什么在编译时需要知道对象的内存配置文件以进行堆栈放置?
- 如果没有指针,如何识别堆栈上的内存?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么分配堆内存比分配堆栈记忆更快
- 双精度为“无符号长长”会导致内存(堆栈?)损坏
- C++内存堆栈/寄存器范围
- 堆栈内存/堆栈
- 指向地址和内存堆栈的指针