【问题标题】:New Operator causes Memory Corruption [closed]新运算符导致内存损坏[关闭]
【发布时间】:2013-01-24 08:14:34
【问题描述】:

我使用 new 来分配内存并初始化一个类的变量。

这是使用的代码:

新运算符:

ptrIssuResrc = new IssuResource();
-----------------------------------

类定义:

class IssuResource
{
 public:
    // constructor: create a IssueResource object
    IssuResource(void)
    {
        lastUpdatedResource = 0;
    }
    UINT16 lastUpdatedResource;
    UINT32 conn_list[MAX_CONNECTION];
    bool addConnResourceToList(UINT32);

使用ptrIssuRescr

class IssuResource *issuResrcPtr = NULL;
issuResrcPtr = card->ptrIssuResrc;

class IssuResource *ptrIssuResrc = card->ptrIssuResrc;
ptrIssuResrc->addConnResourceToList(connection->getLcn());

由于此代码,我面临一些内存损坏,已缩小范围。请帮我解决这里有什么问题?如何确保没有内存损坏?我已将新运算符移动到代码中的另一个位置,它工作正常。但我仍然需要确保这不会导致新问题。

TIA

【问题讨论】:

  • 你没有在这段代码的任何地方使用new
  • 访问conn_list时可能越界,发布更多相对于1conn_list1访问的代码?
  • conn_list 未定义,未指定 MAX_CONNECTION。
  • 其他一切都正常工作,否则这不会显示内存损坏。再次,仔细考虑您的card 课程(因为我们不能,您必须)。您将这一行作为问题的第一行:ptrIssuResrc = new IssuResource();在您的真实代码中该代码在哪里?是在card的构造函数还是成员函数中? cards 是否曾被复制? card 是否实现了 Rule of Three 如果它有实时动态指针?等
  • @FatemaMerchant 您在其他地方有未定义的行为,这导致写入一些您不应该写入的内存。只有当受影响的内存包含重要数据时,您才会看到错误,并且只有在您尝试使用数据时才会看到错误。在这种情况下,您正在编写的是管理堆所需的数据,而operator new 是使用它的无辜受害者。

标签: c++ memory-management new-operator


【解决方案1】:

由于我们不熟悉您的代码,因此我们无法真正帮助您。你的类定义并没有告诉我们一切——我们应该知道在执行代码期间你的对象到底发生了什么。如果你不能使用 Valgrind,我会推荐你​​使用 AppVerifier + DebugDiag,它们是免费的并且可以在 Windows 操作系统上运行。

这些应用程序在内存损坏方面帮助了我很多。为了找出我的代码出了什么问题,我苦苦挣扎了很长时间,多亏了他们,我只花了几分钟就搞定了。

这里是如何使用它们的好教程的链接:http://blogs.msdn.com/b/lagdas/archive/2008/06/24/debugging-heap-corruption-with-application-verifier-and-debugdiag.aspx

它基本上会告诉您堆损坏出现在哪个位置,因此您发现问题会容易得多。

希望这会对您有所帮助。

【讨论】:

    【解决方案2】:

    好吧,您的帖子中没有很多上下文,但是您可以尝试在 Valgrind 中运行此代码,以查看是否有任何内存韭菜、访问未初始化数据等。

    可能更多一些说明问题的代码会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多