2013-01-24 95 views
-2

使用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()); 

由于此代码,我正面临一些内存损坏,已经缩小。请帮我解决这里最新的错误?我怎样才能确保没有记忆coruuption?我已经将新操作符移动到代码中的另一个位置,并且它工作正常。但我仍然需要确保不会导致新问题。

TIA

+0

您在此代码中的任何地方都没有使用'new'。 – Gorpik

+0

访问'conn_list'时可能超出边界,发布更多相对于1conn_list1访问的代码? – billz

+1

conn_list保持未定义状态,未指定MAX_CONNECTION。 – Arjan

回答

0

那么,有没有很多在您的文章上下文的,但你可以尝试运行在Valgrind的这段代码,看看是否有任何记忆韭菜,访问未初始化的数据,等等。

也许一些代码ilustrates的问题将有助于...

2

我们不能真正帮助你,因为我们不熟悉你的代码。你的类定义并没有告诉我们所有的东西 - 我们应该知道你的对象在执行代码时究竟发生了什么。如果你不能使用Valgrind,我会推荐你​​使用AppVerifier + DebugDiag,它们是免费的并且可以在Windows操作系统上运行。

这些应用程序帮助我了很多内存损坏。我花了很长时间才发现我的代码有什么问题,并且感谢他们只花了几分钟的时间来完成这个任务。

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

它基本上会告诉你在哪个地方出现堆损坏,所以这将是您更容易找到问题。

希望这会帮助你。