CodeGuard发布了以下声明:
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)"?我在哪里查找数组的分配位置?
发布于 2022-09-13 06:51:17
system.pas是VCL的一部分。您知道VCL是用PASCAL编写的,这就是为什么*.pas文件仍然可以在C++构建器中编译.这暗示了问题在于某些VCL组件的使用..。
错误显示,在App或某些类析构函数上,有些VCL内容从未被释放/发布,这可能会忘记delete或delete[],但是,我也看到了这也是C++Bulder部件上编译器错误的结果。
如果您使用的是像我这样的旧版本的C++Builder,请参阅related:
这样的问题经常会出现(根据我的经验),如果你:
使用
new,delete**.**单独使用 VCL组件(特别是表单)
AnsiString 常量具有未对齐长度(不超过4个字节的倍数)在我看来,这实际上不是AnsiString的一个bug,但是我多次看到的CodeGuard本身,即使访问运行时变量AnsiString在某些情况下也会产生这样的错误,但是如果没有CodeGuard,则运行良好.
name 与VCL或任何其他库(包括)的冲突如果你把英文名字也用在你的东西上,这很常见.VCL通常以大写字母(如Draw )开头,有时,如果您声明自己的Draw,这两个字母可以混合在一起,而不会产生编译器错误。这类项目倾向于在一些构建上使用正确的,而在另一些构建上使用错误的绘图(例如,在源中任何小的更改之后,比如添加空行或空格后)。
*.h,*.cpp 文件 #include ,它们的编译方式不同已经多次看到这种情况,特别是在BCB6中,这样的项目有时是错误编译的,没有任何错误,但是代码没有做应该做的事情.
所以,不要将添加到项目文件中,这些文件应该只是正常的#included,大多数情况下,这些东西会按预期工作,但是一旦项目变得更大,这种交换就会产生问题.
然而,如果这个bug只出现在App上,那么这没什么大不了的,因为操作系统无论如何都会释放这些东西,所以不会发生真正的内存泄漏。摆脱这些是不容易的(有时甚至不可能)
要标识内存块,您可以在“监视”窗口中检查您的可视组件,如果在其中添加Form1,您将看到指针值为十六进制。但是,如果您有太多的组件,检查所有的组件都会带来麻烦.
要识别错误产生的位置,您必须检查您的调用跟踪在0x00F6BAAE - System.pas#4942之前发生了什么,所以单击下面的其他地址,它应该显示一个回叫。直到你找到你自己的密码
https://stackoverflow.com/questions/73696943
复制相似问题