2013-06-20 46 views
0

我继承含有下列通路一些代码:我是否需要为此作业使用临时值?

TStringList* pPortList(NULL); 
pPortList = FindCommPorts(); 
ConnectionDialog->PortList = pPortList; 
int nModalReturn = ConnectionDialog->ShowModal(); 
delete pPortList; 

FindCommPorts()是创建new TStringList(),填充它,并返回它的功能。

我很想用这个来代替代码:

ConnectionDialog->PortList = FindCommPorts(); 
int nModalReturn = ConnectionDialog->ShowModal(); 

但后来我意识到我不是C++的所有权语义不够熟悉,可以肯定这一点。请问这会泄漏内存,因为FindCommPorts()的结果从来就不是delete d?

编辑:通过代码再来看,我不认为原始版本导致了悬挂指针 - 事实证明,ConnectionDialog->PortList实际上是一个属性(我使用Borland C++ Builder中6 )。该属性具有自定义设置器,该设置器将TStringList中的字符串复制出来,并且之后不使用传递的指针本身。我很抱歉没有提到这件事 - 代码的写法,它绝对看起来很糟糕。

+0

我不知道,但你继承的代码已经似乎有一个悬挂指针'ConnectionDialog-> PortList'将是一个后调用'删除pPortList'。 – legends2k

+0

我确定希望代码不会设计成会导致内存泄漏 –

+1

原始代码中的下一个语句碰巧是'ConnectionDialog-> PortList = NULL;'或'Delete ConnectionDialog;'? – aschepler

回答

1

如果它从来没有delete d,那么是的,你会泄漏内存。但是,使用此代码的问题更加严重。想想你的情况是这样的:

  • FindCommPorts()返回一个指针
  • 你告诉ConnectionDialog->PortList指向相同的内存FindCommPorts()结果指向。
  • 然后您deletepPortList指向的内存对象,这与ConnectionDialog->PortList指向的内存相同!

在此之后,PortList变量指向已删除的内存,您不应该访问它。如果您再次需要使用该指针,则不应该将其删除,因此您不必担心将FindCommPorts()的结果直接分配给ConnectionDialog->PortList。只要确保在完成后将其删除即可。

如果您需要该指针永远有效,那么这种情况不是内存泄漏,因为需要数据。在这种情况下,程序终止时内存将被释放。

编辑

阅读编辑你的问题后,我发现你是正确的。你确实需要临时变量来防止内存泄漏。如果不这样做,属性的setter将复制由FindCommPorts()返回的指针指向的对象的副本,然后内存将保持分配状态,但不包含指向它的指针的变量。在这种情况下,您正确地创建临时变量,然后在完成任务后删除它。

相关问题