用智能指针实行所有权

本文探讨了使用返回指针的函数可能导致的错误,如双重删除和不匹配的delete操作。建议遵循使用智能指针(如引用计数指针或作用域指针)来立即接收new创建的对象,避免new[]与delete不匹配,以及防止循环引用。通过智能指针返回函数结果以明确所有权,从而有效防止内存泄露问题。
摘要由CSDN通过智能技术生成

现在我们讨论下使用返回指针的函数的潜在错误。假设有一个函数返回一个指向某个MyClass类型的对象的指针。

MyClass* MyFactoryClass::Create(const Inputs& inputs);

这个函数的一个非常显而易见的问题是,它的调用者是否负责删除这个对象?或者说这个指针所指向的MyClass类的实例是MyFactoryClass所拥有的实例?这个问题显然应该在声明这个函数的头文件中以注释的形式说明。但在软件的世界里,实际上很少能够做到这样。但是,即使函数的作者确实提供了一个注释,表示这个函数在堆上创建了一个新对象,并且由它的调用者负责删除这个对象,我们将会发现自己面临这样一种处境:每当我们接到一个由函数调用所返回的指向某个对象的指针时,我们需要记得检查注释(或者在没有注释时,检查代码本身)来推断是否由我们负责删除这个对象。正如前面所说的,我们应该更多地依赖编译器而不是程序员。因此,实行这个对象所有权的一种可靠方法是让函数返回一个智能指针。例如:

RefCountPtr<MyClass> MyFactoryClass::Create(const Inputs& inputs);

这种设计使函数所返回的对象的所有权毫无争议,不会留下内存泄露的机会。另一方面&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值