首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

new 和delete 有关问题

2012-02-25 
new 和delete 问题在类的构造函数中是否能调用new方法[解决办法]个人觉得最好不要在构造函数里使用可能引

new 和delete 问题
在类的构造函数中是否能调用new方法

[解决办法]
个人觉得最好不要在构造函数里使用可能引起失败的操作,这当然包括内存分配。因为构造函数没有返回值,它不能告诉创建对象的人构造失败的事实。创建对象要干两件事:为对象分配内存和构造对象。语句 CFoo * p = new CFoo(); 只要分配内存成功就会给指针 p 赋有效值,而不管构造是否成功。p 的使用者检查 p 具有有效值就认为创建对象是成功的,然而事实却并非如此,这必然带来难以调试的随机性的运行时错误。

你也许说可以使用异常,然而异常并不是随处可用的,在很多平台或者项目中并不能使用异常,那么你不得不修改原来的代码,关键这涉及到接口,那要改的东西就多咯!:(
[解决办法]
to gexy():

如果有可能分配不成功,如何保证创建出来的结果一定是有意义的呢?不如用一个能够使创建操作返回确定结果的方法。CFoo * p = new CFoo(); 这个语句是创建对象,那么创建对象的语意应该是如果成功,返回这个对象的指针,否则创建失败,返回 NULL。如果内存分配成功但构造对象失败,则创建对象操作是失败的,则不应该返回对象指针。而 C++ 不能完成这个功能。

为了得到确定的结果,需要进一步操作:要么给对象增加一个 IsMature() 方法来判断是否构造成功,要么把可能引起失败的操作移到一个能返回构造结果的函数中,如 int Initialize(),而在构造函数中仅把相应的成员变量赋予一个不会引起错误的初始值,如让指针为空。

这些都需要两步操作,类的使用者很容易忘记后续操作,这是从设计角度不希望的,即对象创建了就是有意义的。那么可以使用工厂方法封装类的创建过程,如:

CFoo * CFoo::CreateInstance()
{
CFoo * pNewObject = new CFoo();
if (pNewObject == NULL)
return NULL;

if (pNewObject-> Initialize() != 0)
{
delete pNewObject;
return NULL;
}

return pNewObject;
}

这个方法是一个静态方法,使用的时候如下:

CFoo * p = CFoo::CreateInstance();
if (p == NULL)
// some error handling code

希望你有更好的方法。

热点排行