【问题标题】:Strange behaviour of new operator in cli projectcli项目中新操作员的奇怪行为
【发布时间】:2013-10-08 13:05:00
【问题描述】:

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

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

其中名称和类型声明为:

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

问题是分配内存后,Name 和 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。

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

【问题讨论】:

  • 你如何确定NameType 指向同一个内存?
  • 您能否提供一个 SSCCE 来显示此问题?
  • 查看他们分配的地址,还是查看他们指向的内容
  • 您将一些内容复制到其中一个然后打印另一个怎么样?这应该让事情更清楚一点......
  • @FLCL 我看到调试器有时会报告不正确的信息。您看到的行为很奇怪,您用来观察行为的工具似乎比正在发生的行为更有可能被破坏,除非有其他相关代码不在您的问题中(例如用户定义的operator new).

标签: c++-cli


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 具有讽刺意味的是,堆栈分配具有相同的地址是完全正常的。这没有回答你的问题。
    • @HansPassant,我从未写过堆栈中的对象具有相同的地址。我的问题是 new 运算符返回相同的地址,答案是关于当我用堆替换堆栈分配时(SomeType someVar; -> SomeType* someVar = new SomeType();)一切正常。
    • 不,我写的 :) 您发现代码不受损坏的堆影响并不意味着您修复了代码中的堆损坏问题。
    • 哦,我现在才明白你的意思)另外,是的,这不是 100% 的修复,也不是 100% 的错误。现在我遇到了一些“访问损坏的内存”错误,即使我将类对象的所有内存分配都更改为基于堆的,但没有堆栈我无法做很多事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    相关资源
    最近更新 更多