我可以制作智能指针的智能指针吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (25)

我是C ++(以及Stack Overflow!)的新手,所以如果这个问题已经以某种身份得到了回答,我很抱歉,我只是无法找到我想要的东西。

在最近的一个项目中,我创建了指针指针(例如:Tiger ** tigerArray;)并且在我的程序中出现内存泄漏,但我无法弄清楚原因。我有一个想法,如果我做了智能指针而不仅仅是指针,那可能已经解决了问题?

所以我很好奇,如果我可以创建一个指向指针的指针,我可以创建一个指向智能指针的智能指针吗?

**对不起,我应该更新,我不允许使用向量进行此分配,我们不得不使用数组

提问于
用户回答回答于

智能点是通用的; 你基本上可以把任何你想要的东西粘在一起。但是你应该根据你想要达到的目标来决定适合这项工作的工具。智能指针具有相当具体的用例,而指针指针有几个不同的用例:

  • 指针数组的指针,用于实现2D数组。如果这是您要实现的目标,请考虑使用std::vector<std::vector<T>>或者std::array<std::array<T, N>, M>如果您知道您的阵列将始终具有Mx 大小N
  • 指向指针的指针,用于修改函数的另一个指针。在这种情况下,您应该考虑通过引用传递。如果你真的需要代码中的指针,你可以通过传递as作为T*&对指针的引用来修改一个T。但是,根据您所代表的内容,您也可以将数据传递给您std::vector<T>&,例如。

存在智能指针以根据您希望如何使用这些对象来自动管理对象的生命周期。它们并不纯粹作为一种间接方式存在,它可以用于许多不同的用法,比如原始指针。关于使用哪种工具的建议如下:

  • 如果你需要一个简单的可调整大小的数组T,请使用std::vector<T>
  • 如果您需要2D可调整大小的数组T,请使用std::vector<std::vector<T>>
  • 如果您知道N阵列中将始终包含元素,请考虑使用std::array<T, N>
  • 如果你需要更多的结构,如严格的排序或关系,可以考虑使用std::setstd::mapstd::multimapstd::queuestd::stack,等

关于智能指针:

  • 如果你需要一个轻量级的对象来传递但只有一个拥有者,或者如果你需要封装在一个地方使用的多态对象,请考虑 std::unique_ptr<T>
  • 如果您需要一个对象在代码中被多个地方使用,而这些地方没有一个合理的所有权,而是需要拥有分布式所有权,请使用 std::shared_ptr<T>
  • 如果要从函数内部修改对象,使对象在函数需要的持续时间内生效,只需通过引用传递: T&
  • 如果你想在函数需要的时间内读取但不修改该对象将处于活动状态的对象,则通过引用传递给const: const T&

编辑:

在看到您不被允许std::vector用于您的任务后,我意识到我并没有真正回答您的更新问题。但我仍然希望能给你(以及未来的读者)一些关于智能指针是什么以及它们不适用的一些见解。

如果您的教师正在教授C ++但不允许您使用vectors,我会批评他们说这vector是现代C ++开发人员的一个非常重要的工具,它的使用比C风格的替代方案更简单,更安全。在许多过时的课程中仍然被教导为C ++。其他工具和技术也是如此,例如通常避免使用指针,避免newdelete充分利用标准库的容器和算法,所有这些都可以帮助您编写更清晰,更正确,更高效的代码。

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问12 回答
  • 四无君

    0 粉丝0 提问3 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    46 粉丝0 提问2 回答
  • 拉布拉多拉不多

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券