我使用BDS 2006年的Turbo C ++很长一段时间了,我的一些更大的项目(CAD / CAM,三维 GFX引擎和天文计算)的偶尔在3-12个月内全天候重型使用的抛出异常(例如一次)。 大量的调试后,我发现这一点:
//code1:
struct _s { int i; } // any struct
_s *s=new _s[1024]; // dynamic allocation
delete[] s; // free up memory
这个代码通常是内部模板,其中_s
可也因此类delete[]
这个代码应能正常工作,但delete[]
不正确的结构工作(类看起来OK)。 没有例外被抛出,内存被释放,但它在某种程度上损害了内存管理器分配表,并在此之后的任何新的分配可能是错的(新可以创建与已经分配的空间,甚至未分配的空间,因此偶尔的例外重叠分配)
我发现,如果我添加空的析构函数_s
不是突然似乎一切OK
struct _s { int i; ~_s(){}; }
现在好了,说到怪异的一部分。 我更新这个对我的项目后,我发现, AnsiString
类有坏也重新分配。 例如:
//code2:
int i;
_s *dat=new _s[1024];
AnsiString txt="";
// setting of dat
for (i=0;i<1024;i++) txt+="bla bla bla\r\n";
// usage of dat
delete[] dat;
在此代码dat
包含了一些有用的数据,再后来是一些txt
通过增加线创建的字符串,因此txt
必须重新分配几次,有时dat
数据被覆盖txt
(即使他们不重叠,我的事情临时AnsiString
需要重新分配txt
与重叠dat
)
所以我的问题是:
- 我做一些错误的代码1,代码2?
有没有办法避免
AnsiString
(再)分配错误? (但仍在使用它)- 大量的调试后(张贴问题2后),我发现
AnsiString
不会产生问题。 他们只在使用它们发生。 真正的问题可能是在OpenGL客户端之间切换。 我打开/保存对话框与预览矢量图形。 如果我禁用的OpenGL使用这些VCL子窗口比AnsiString
的内存管理错误完全消失。 我不是托是什么问题(MFC / VCL窗口或者更可能我做了在切换上下文的一些失误,将进一步调查之间的不兼容)。 值得关注的OpenGL窗口是: - 里面主要VCL表格+ 的OpenGL
Canvas
客户区 - 里面主要MFC打开/保存对话框的孩子+对接的预览VCL表格+ 的OpenGL
Canvas
客户区
- 大量的调试后(张贴问题2后),我发现
PS
- 这些错误取决于数量的
new/delete/delete[]
用法不上分配的大小 - 两个代码1和代码2的错误是重复的(例如具有解析器加载复杂ini文件和在同一行上,如果INI不改变发生错误)
- 我只检测大项目(普通源代码> 1MB)与组合使用这些错误
AnsiString
和模板的内部动态分配,但可能他们也是比较简单的项目,但出现如此罕见,我错过它。 - 感染的项目规格:
- 的win32 noinstall独立(使用Win7sp1 64,但是,XPSP3 X32行为相同)
- 不计,如果使用GDI或OpenGL / GLSL
- 不计,如果使用设备驱动程序的DLL S,或不
- 没有OCX,或非标准的VCL组件
- 没有的DirectX
- 1个字节对齐编译/链接
- 不使用RTL,包或框架(单机)
对不起,我英语不好/语法...任何帮助/结论/建议表示赞赏。