C++ cli cli项目中新操作符的奇怪行为

C++ cli cli项目中新操作符的奇怪行为,c++-cli,C++ Cli,在CLI C++项目的原生类的非静态函数中,我给对象的2个字段分配新的内存空间: Name = new wchar_t[50]; Type = new wchar_t[50]; 其中名称和类型声明为: class MyClass { ... whcar_t *Name; whcar_t *Type; ... } 问题是分配内存后,名称和类型字段指向同一内存。怎么能修好呢 更新: 我投下的每一个新角色都会返回相同的地址newsomeclass()返回与new wchar\u t[50]相同

在CLI C++项目的原生类的非静态函数中,我给对象的2个字段分配新的内存空间:

Name = new wchar_t[50];
Type = new wchar_t[50];
其中名称和类型声明为:

class MyClass
{
...
 whcar_t *Name;
 whcar_t *Type;
...
}
问题是分配内存后,名称和类型字段指向同一内存。怎么能修好呢

更新:

我投下的每一个新角色都会返回相同的地址
newsomeclass()
返回与
new wchar\u t[50]
相同的指针!它可能与在cli项目中分配本机内存的某个错误有关吗

更新2

内存分配不适用于malloc、calloc和new操作符,但可以使用LocalAlloc和静态分配,如
wchar\t Name[50]
。据我所知,很难找到分配不好的原因,但我甚至不知道,这是什么迹象?就像@Hans Passant说的那样,腐败成堆?或者可能是操作系统故障或某种自定义AutoCad内存分配的错误?有没有办法找到在当前代码行中使用哪个堆来分配内存

我正在使用MS Visual Studio 2008 SP1


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

这些问题通常由堆损坏来解释。任何使用C字符串并使用像50这样的神奇数字的程序的祸根。只需将一个包含50个或更多字符的字符串复制到该字段中,您就破坏了堆的完整性。接下来发生的事情是不可预测的,让分配器重复返回相同的堆块肯定不是不可能的


反措施是使用聪明的C++类来管理内存,比如STD::WScL.还有一个调试分配器,就是你从

#include
中得到的那种。和其他各种内存调试工具一样,它曾经是一个活跃的工具市场。当然,使用托管代码而不是本机代码,内存管理失误是托管代码最初被发明的一个重要原因。调试堆损坏问题可能会非常痛苦,祝你好运。

我可能已经找到了答案,这很奇怪:方法中静态创建的本地对象导致了内存分配错误(?)。替换
SomeType-someVar后SomeType*someVar=new SomeType()的函数中的code>已分配内存的地址变得不同。这是随机找到的解决方案,我不是绝对肯定,但我发现了这种情况,所以这可能是一个答案。

您如何确定
名称
类型
指向相同的内存?您能提供一个显示此问题的示例吗?查看它们分配的地址,或者看看他们所指的内容?你把一些东西复制到其中一个,然后打印另一个怎么样?这应该让事情更清楚一点…@FLCL我看到调试器有时报告错误的信息。你看到的行为非常奇怪,以至于你用来观察行为的工具被破坏的可能性远远大于行为发生的可能性,除非有其他相关代码不在你的问题中(比如用户定义的
操作符new
)有一点很讽刺,堆栈分配具有相同的地址是完全正常的。这并不能回答你的问题。@HansPassant,我从来没有写过,堆栈中的对象有相同的地址。我的问题是,新操作符返回相同的地址,答案是当我用heap(
SomeType-someVar;
->
SomeType*someVar=new-SomeType();
)替换所有堆栈分配时,一切正常。不,我写道:)您发现的代码不受损坏堆的影响并不意味着您修复了代码中的堆损坏问题。哦,我现在才理解您的意思)而且,是的,这不是100%修复,也不是100%错误。现在我遇到了一些“访问损坏内存”的错误,即使我将类中对象的所有内存分配更改为基于堆的,也有很多事情是没有堆栈无法完成的。