c++如何检查对堆内存的访问

C++ how to check the access to heap memory

本文关键字:内存 访问 检查 何检查 c++      更新时间:2023-10-16

我有以下问题。我不知道这是否可能,怎么可能。我想了解代码何时使用在堆中分配的内存地址(用于内置和用户定义的所有类型的对象)。例如:

char* p= new char[60];
strcpy(p,"home");  // statement A

有一种方法可以理解"语句a"正在使用在堆中分配的地址"p"?通过重新定义操作符new,我可以存储堆地址,但是如何理解某些指令何时使用它们?我想以一种透明的方式为用户做这件事。

Thanks a lot

******示例

char* p= new char[60];
delete [] p;
strcpy(p,"home");  // statement A

我想警告这个无效的内存访问。要做到这一点,我必须理解策略试图访问地址p,所以我可以对p的有效性执行一些测试。

请看:http://www.hboehm.info/gc/gcdescr.html它是C/c++的透明垃圾收集器。它以您描述的方式跟踪存在的引用内存位置的指针:

在每个集合中,收集器标记所有可能从指针变量可访问的对象。因为它一般不知道在哪里指针变量定位后,它扫描以下根段指针:

寄存器。根据体系结构的不同,这可以使用汇编代码完成,也可以通过调用类似setjsp的函数来保存在堆栈上注册内容。堆栈(s)。在a单线程应用程序,在大多数平台上,这是由扫描当前堆栈之间(近似)的内存指针和GC_stackbottom。(对于Itanium,寄存器堆栈被扫描分别)。GC_stackbottom变量设置在一个高度特定于平台的方式,取决于适当的配置gcconfig.h中的信息。注意,当前活动的堆栈需要要仔细扫描,因为客户端代码的调用者保存寄存器可能出现在收集器堆栈帧内,它可能在马克的过程。这是通过扫描堆栈的某些部分来解决的

静态数据区域。在最简单的情况下,这是在gcconfig.h中定义的DATASTART和DATAEND之间的区域。然而,在大多数情况下,这还将涉及与之关联的静态数据区域动态库。这些是由"大多数"确定的dyn_load.c中的平台特定代码。

标记维护一个显式的内存区域堆栈,这些内存区域已知是可访问的,但尚未被搜索包含指针。的起始地址要扫描的块,以及块的描述符。如果没有块的布局信息可用,然后描述符为就是长度。(其他可能性请参见gc_mark.h)

你可以想象,你必须卷起袖子,做一些非常低级的技巧来管理它,像这样扫描内存是一件昂贵的事情,所以我认为你不能出于安全原因对悬空指针这样做。

我建议不要这么透明地这么做。让用户获得对象的句柄,就像智能指针一样,这样就可以更容易地实施垃圾收集或针对悬空指针的安全措施或任何您喜欢的措施。c++擅长于这种半透明的解决方案,在这种解决方案中,您可以创建感觉像指针的对象,并提供相同的操作符,但可以在上面做任何您想要的。

这个问题没有意义。Strcpy认为指针指向有效的内存,所以这里不需要知道任何特殊的东西。如果你想断言内存是有效的,使用一个类来处理这个问题。这样你就可以知道记忆是有效的。

在这种情况下,std::string将是正确的选择,否则std::vector或std::shared_ptr.