Memory management bds 2006 C隐藏内存管理器冲突(类别新建/删除[]与AnsiString)

Memory management bds 2006 C隐藏内存管理器冲突(类别新建/删除[]与AnsiString),memory-management,struct,c++builder,ansistring,c++builder-2006,Memory Management,Struct,C++builder,Ansistring,C++builder 2006,我使用BDS 2006 Turbo C++已有很长一段时间了,我的一些更大的项目(CAD/CAM、3Dgfx引擎和天文计算)偶尔会抛出异常(例如,每3-12个月24/7重负荷使用一次)。经过大量调试后,我发现: //代码1: 结构_s{int i;}//任何结构 _s*s=new _s[1024];//动态分配 删除[]s;//释放内存 此代码通常位于模板内,\u s也可以是类,因此delete[]此代码应能正常工作,但delete[]不能正常工作于结构(类看起来正常)。不会引发异常,内存会被

我使用BDS 2006 Turbo C++已有很长一段时间了,我的一些更大的项目(CAD/CAM、3Dgfx引擎和天文计算)偶尔会抛出异常(例如,每3-12个月24/7重负荷使用一次)。经过大量调试后,我发现:

//代码1:
结构_s{int i;}//任何结构
_s*s=new _s[1024];//动态分配
删除[]s;//释放内存
此代码通常位于模板内,
\u s
也可以是类,因此
delete[]
此代码应能正常工作,但
delete[]
不能正常工作于结构(类看起来正常)。不会引发异常,内存会被释放,但它会以某种方式损坏内存管理器分配表,在此之后,任何新的分配都可能是错误的(新的分配可能会创建与已分配的空间甚至未分配的空间重叠的分配,因此偶尔会出现异常)

我发现,如果我将空析构函数添加到
\u
中,那么突然间一切似乎都正常了

struct\u s{int i;~\u s(){};}
现在是奇怪的部分。在我将其更新到我的项目中之后,我发现
AnsiString
类也存在错误的重新分配。例如:

//代码2:
int i;
_s*dat=new_s[1024];
AnsiString txt=“”;
//dat的设置
对于(i=0;i 1MB),组合使用
ansisting
和具有内部动态分配的模板,但它们也可能在更简单的项目中,但很少出现,因此我会错过
  • 受感染的项目规格:
    • win32 noinstall standalone(使用Win7sp1 x64但在XPsp3 x32上的行为相同)
    • 如果使用GDIOpenGl/GLSL
    • 是否使用设备驱动程序DLLs不计量
    • 无OCX或非标准VCL组件
    • DirectX
    • 1字节对齐编译/链接
    • 不要使用RTL、包或框架(独立)
  • 对不起,英语/语法不好。。。
    非常感谢您的帮助/结论/建议。

    经过大量调试,我很好地解决了这个问题。 BDS2006 Turbo C++的内存管理在尝试调用已删除的指针的任何删除之后变得腐朽。例如:

    BYTE*dat=新字节[10],*tmp=dat;
    删除[]dat;
    删除[]tmp;
    
    之后,内存管理就不可靠了。(“新建”可以分配已分配的空间)

    当然,删除同一个指针两次是程序员方面的错误,但我已经找到了产生此问题的所有问题的真正原因(源代码中没有任何明显的错误)请参阅以下代码:

    //---------------------------------------------------------------------------
    课堂测试
    {
    公众:
    int siz;
    字节*dat;
    测试()
    {
    siz=10;
    dat=新字节[siz];
    }
    ~test()
    {
    
    delete[]dat;//您可能希望使用过时程度较低的工具。