在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 function, where Terminal used
内存分配不适用于malloc,calloc,new运算符,但使用LocalAlloc和静态分配(如wchar_t Name[50]
)。正如我所理解的那样,很难找到分配不良的原因,但我甚至不知道,这是什么迹象?堆积腐败,正如@Hans Passant所说的那样?或者它可能是操作系统故障或某种自定义AutoCad内存分配的错误?有没有办法找到哪个堆用于在当前代码行上分配内存?
我正在使用MS Visual Studio 2008 SP1。
将对象初始化从基于堆栈的替换为堆解决了这个问题。
答案 0 :(得分:2)
这些问题通常由堆损坏解释。使用C字符串并使用魔术数字50的任何程序的祸害。它只需要将一个包含50个或更多字符的字符串复制到该字段中,并且您已经破坏了堆的完整性。接下来发生的事情是非常不可预测的,让分配器重复返回相同的堆块当然不是不可能的。
对策正在使用更智能的C ++类来管理内存,比如std :: wstring。还有一个调试分配器,就是你从#include <crtdbg.h>
中得到的那种。除了各种其他内存调试工具,它曾经是一个生动的工具市场细分市场。当然,使用托管代码而不是本机代码,内存管理失败是托管代码首先被发明的一个重要原因。调试堆损坏问题可能非常痛苦,祝你好运。
答案 1 :(得分:0)
我可能已经找到了答案并且非常奇怪:在方法中静态创建的本地对象会导致此内存分配错误(?)。在用SomeType someVar;
函数替换SomeType* someVar = new SomeType();
后,已分配内存的地址变得不同。这是随机找到的解决方案,我不是很确定,但后来我发现here描述了这种情况,所以它可能是一个答案。