0

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

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

其中 Name 和 Type 声明为:

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

问题是分配内存后,Name 和 Type 字段指向同一个内存。如何修复?

更新:

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

更新 2

Native 类,在 cli 类中初始化了哪些字段

托管类定义

托管类功能,终端使用

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

我正在使用 MS Visual Studio 2008 SP1。

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

4

2 回答 2

2

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

对策是使用更智能的 C++ 类来为您管理内存,例如 std::wstring。还有一个调试分配器,你可以从#include <crtdbg.h>. 与其他各种内存调试工具一样,它曾经是一个活跃的工具市场。当然,使用托管代码而不是本机代码,内存管理事故是最初发明托管代码的一个重要原因。调试堆损坏问题可能非常痛苦,祝你好运。

于 2013-10-08T14:58:21.050 回答
0

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

于 2013-10-09T09:23:22.833 回答