首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释C++Builder CodeGuard输出?

如何解释C++Builder CodeGuard输出?
EN

Stack Overflow用户
提问于 2022-09-13 02:26:53
回答 1查看 48关注 0票数 0

CodeGuard发布了以下声明:

代码语言:javascript
复制
9/12/2022 7:04:08 PM started a CodeGuard(tm) process: MyProg.exe(12200)  
Resource leak in process: MyProg.exe(12200)  - System.pas#4942  
  The memory block (0x305EBC0) was never freed  
  The memory block (0x0305EBC0) [size: 16 bytes] was allocated with SysGetMem  
    0x00F6BAAE - System.pas#4942  
    0x0128535B  
    0x012853A7  
    0x0128552A  

我不知道System.pas是什么。如何识别“内存块(0x305EBC0)"?我在哪里查找数组的分配位置?

EN

回答 1

Stack Overflow用户

发布于 2022-09-13 06:51:17

system.pas是VCL的一部分。您知道VCL是用PASCAL编写的,这就是为什么*.pas文件仍然可以在C++构建器中编译.这暗示了问题在于某些VCL组件的使用..。

错误显示,在App或某些类析构函数上,有些VCL内容从未被释放/发布,这可能会忘记deletedelete[],但是,我也看到了这也是C++Bulder部件上编译器错误的结果。

如果您使用的是像我这样的旧版本的C++Builder,请参阅related:

这样的问题经常会出现(根据我的经验),如果你:

使用

  1. create/allocate new,delete**.**

单独使用 VCL组件(特别是表单)

  1. have全局 AnsiString 常量具有未对齐长度(不超过4个字节的倍数)

在我看来,这实际上不是AnsiString的一个bug,但是我多次看到的CodeGuard本身,即使访问运行时变量AnsiString在某些情况下也会产生这样的错误,但是如果没有CodeGuard,则运行良好.

  1. have name 与VCL或任何其他库(包括)的冲突

如果你把英文名字也用在你的东西上,这很常见.VCL通常以大写字母(如Draw )开头,有时,如果您声明自己的Draw,这两个字母可以混合在一起,而不会产生编译器错误。这类项目倾向于在一些构建上使用正确的,而在另一些构建上使用错误的绘图(例如,在源中任何小的更改之后,比如添加空行或空格后)。

  1. have使用的是内置单元,而不是普通的 *.h,*.cpp 文件 #include ,它们的编译方式不同

已经多次看到这种情况,特别是在BCB6中,这样的项目有时是错误编译的,没有任何错误,但是代码没有做应该做的事情.

所以,不要将添加到项目文件中,这些文件应该只是正常的#included,大多数情况下,这些东西会按预期工作,但是一旦项目变得更大,这种交换就会产生问题.

然而,如果这个bug只出现在App上,那么这没什么大不了的,因为操作系统无论如何都会释放这些东西,所以不会发生真正的内存泄漏。摆脱这些是不容易的(有时甚至不可能)

要标识内存块,您可以在“监视”窗口中检查您的可视组件,如果在其中添加Form1,您将看到指针值为十六进制。但是,如果您有太多的组件,检查所有的组件都会带来麻烦.

要识别错误产生的位置,您必须检查您的调用跟踪在0x00F6BAAE - System.pas#4942之前发生了什么,所以单击下面的其他地址,它应该显示一个回叫。直到你找到你自己的密码

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73696943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档