cli项目中新运算符的奇怪行为

时间:2013-10-08 13:05:01

标签: c++-cli

在cli c ++项目的本机类的非静态函数中,我将新内存空间分配给对象的2个字段:

Name = new wchar_t[50];
Type = new wchar_t[50];

其中Name和Type声明为:

class MyClass
{
...
 whcar_t *Name;
 whcar_t *Type;
...
}

问题是在分配内存后,名称和类型字段指向相同的内存。如何解决?

更新

同样的地址会在每次投射时返回。 new SomeClass()返回与new wchar_t[50]相同的指针!可能它与cli项目中分配本机内存的一些错误有关吗?

更新2

Native class, which fields are initialized in cli class

Managed class definition

Managed class function, where Terminal used

内存分配不适用于malloc,calloc,new运算符,但使用LocalAlloc和静态分配(如wchar_t Name[50])。正如我所理解的那样,很难找到分配不良的原因,但我甚至不知道,这是什么迹象?堆积腐败,正如@Hans Passant所说的那样?或者它可能是操作系统故障或某种自定义AutoCad内存分配的错误?有没有办法找到哪个堆用于在当前代码行上分配内存?

我正在使用MS Visual Studio 2008 SP1。

将对象初始化从基于堆栈的替换为堆解决了这个问题。

2 个答案:

答案 0 :(得分:2)

这些问题通常由堆损坏解释。使用C字符串并使用魔术数字50的任何程序的祸害。它只需要将一个包含50个或更多字符的字符串复制到该字段中,并且您已经破坏了堆的完整性。接下来发生的事情是非常不可预测的,让分配器重复返回相同的堆块当然不是不可能的。

对策正在使用更智能的C ++类来管理内存,比如std :: wstring。还有一个调试分配器,就是你从#include <crtdbg.h>中得到的那种。除了各种其他内存调试工具,它曾经是一个生动的工具市场细分市场。当然,使用托管代码而不是本机代码,内存管理失败是托管代码首先被发明的一个重要原因。调试堆损坏问题可能非常痛苦,祝你好运。

答案 1 :(得分:0)

我可能已经找到了答案并且非常奇怪:在方法中静态创建的本地对象会导致此内存分配错误(?)。在用SomeType someVar;函数替换SomeType* someVar = new SomeType();后,已分配内存的地址变得不同。这是随机找到的解决方案,我不是很确定,但后来我发现here描述了这种情况,所以它可能是一个答案。