函数返回一个指向对象的指针,在这种情况下我应该返回啥?

Posted

技术标签:

【中文标题】函数返回一个指向对象的指针,在这种情况下我应该返回啥?【英文标题】:function returns a pointer to an object, what should I return in this case?函数返回一个指向对象的指针,在这种情况下我应该返回什么? 【发布时间】:2015-01-04 19:20:23 【问题描述】:

如果你有一个函数通过在数组中查找具有特定属性的对象来返回指向对象的指针,如果在数组中没有找到对应的对象,我应该返回什么?而且,如果做得不好,这是否会对程序的安全性或稳定性构成风险?

【问题讨论】:

【参考方案1】:

如果你有一个函数通过查找返回指向对象的指针 对于这些对象的数组中的特定属性,应该 如果我在数组中找不到该属性,我会返回吗?如果完成 这很可能对系统的安全性或稳定性构成风险 程序?

正如哥伦布所说:

你有三种基本的可能性:

只返回一个空指针。这是最简单的方法,而且很可能是最好的方法。 抛出异常。最好是特殊类型,但std::out_of_range 也可以。 返回指向默认对象的指针。仅当返回值必须指向有效对象时才合理。

但是,我不同意您选择的选项。只有前两个可以合理考虑,除非你确定你总是会返回一个有效的对象。

而且,如果做得不好,这是否会对安全或安全造成风险? 程序的稳定性?

是的。想象一下,您选择了可能性 #3 并将其记录在您的 API 中。调用者每次都期待一个有效的对象。假设您的应用程序是服务器的关键组件,攻击者发现了导致覆盖表中数据的漏洞。这很可能会导致您的应用程序崩溃:您会立即受到拒绝服务攻击。这真的不是一个牵强附会的场景……

如果做得不好,甚至没有达到那么远,您可能会返回无效的指针,这可能会导致应用程序崩溃。话又说回来,任何做得不好都会导致阴暗面......

【讨论】:

【参考方案2】:

如果你有一个函数通过查找返回指向对象的指针 对于这些对象的数组中的特定属性,应该 如果我在数组中找不到该属性,我会返回吗?如果完成 这很可能对系统的安全性或稳定性构成风险 程序?

你有三种基本的可能性:

只返回一个空指针。这是最简单的方法,而且很可能是最好的方法。 抛出异常。最好是特殊类型,但std::out_of_range 也可以。 返回指向默认对象的指针。仅当返回值必须指向有效对象时才合理。

无论您选择什么,都必须记录在案并尽可能与其他案例保持一致。

【讨论】:

【参考方案3】:

您可以返回 nullptr 并遵循调用者应测试该案例的约定。或者你可以抛出一个异常。

您可能会使用一些智能指针。

使用 C++11,您可以采用不同的方法:传递一个 lambda 函数来处理找到的对象。

【讨论】:

以上是关于函数返回一个指向对象的指针,在这种情况下我应该返回啥?的主要内容,如果未能解决你的问题,请参考以下文章

引用用于函数参数,返回值,及指向指针的引用

返回指向对象的参数指针

当函数返回时,指向超出范围的对象的 C++ 指针 - 为啥会这样?

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

从函数 C++ 正确传递指针

函数是不是应该返回一个“新”对象