gpt4 book ai didi

c++ - 如何检查指针指向 iOS 上的堆或堆栈内存?

转载 作者:可可西里 更新时间:2023-11-01 06:10:22 25 4
gpt4 key购买 nike

这类似于 another question ,无论如何我正在寻找一种特定于平台的方法来执行此操作(如果它存在于 iOS 上)。

为 Apple 平台开发意味着基于非 Apple 的工具集通常不太适用。所以我希望找到平台本地方式来做到这一点。因为简单的谷歌搜索给了我 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

更新了关于操作系统可移植堆检测的帖子:

否则,您可以通过覆盖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++ - 如何检查指针指向 iOS 上的堆或堆栈内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17822730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com