加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何在iOS上检查指针是指向堆还是堆栈内存?

发布时间:2020-12-16 07:05:17 所属栏目:百科 来源:网络整理
导读:这与 another question类似,无论如何我正在寻找一种特定于平台的方法来实现这一点,如果它存在于iOS上. 为Apple平台开发意味着非基于Apple的工具集通常不太适用.所以我希望找到平台原生方式来做到这一点.因为简单的Google搜索给了我this( heap command),我确
这与 another question类似,无论如何我正在寻找一种特定于平台的方法来实现这一点,如果它存在于iOS上.

为Apple平台开发意味着非基于Apple的工具集通常不太适用.所以我希望找到平台原生方式来做到这一点.因为简单的Google搜索给了我this(heap command),我确信它还有一个API函数.

我正在寻找这个只用于调试构建断言来检测删除堆栈分配对象的情况.所以它足以知道地址指向的位置 – 堆栈或堆.因此,性能,版本兼容性,内部API或任何质量问题无关紧要. (也许在模拟器上测试也可以是一个选项)但我认为如果堆栈与堆完全分离,这不是那么繁重的操作.

我标记了C,但是如果它适用于C,那么任何其他语言的API都可以.

解决方法

如果您在iOS上使用GNU GCC编译器和glibc,那么我相信您可以使用mprobe() – 如果失败则内存块已损坏或堆栈内存块.

http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html

OS便携式堆检测的更新帖子:

否则,您可以通过覆盖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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读