我继承含有下列通路一些代码:我是否需要为此作业使用临时值?
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
中的字符串复制出来,并且之后不使用传递的指针本身。我很抱歉没有提到这件事 - 代码的写法,它绝对看起来很糟糕。
我不知道,但你继承的代码已经似乎有一个悬挂指针'ConnectionDialog-> PortList'将是一个后调用'删除pPortList'。 – legends2k
我确定希望代码不会设计成会导致内存泄漏 –
原始代码中的下一个语句碰巧是'ConnectionDialog-> PortList = NULL;'或'Delete ConnectionDialog;'? – aschepler