【问题标题】:C++ Should I raw pointer (instead of smart) if I am pointing / referencing / making an alias?如果我指向/引用/制作别名,我应该使用原始指针(而不是智能指针)吗?
【发布时间】:2015-11-26 15:39:07
【问题描述】:

我正在创建一个字符串解析器类,并且有很多子子私有成员函数都需要访问输入。我想避免将输入作为每个函数的参数,例如

string out = func(input){ sub_func(input) { sub_sub_func(input) } } }

我一直听说原始指针很糟糕,但是对于“仅使用指针来引用某物”这种特定情况仍然没有得到明确的答案。我可以的

string m_str //declared as private member
func(string& input) { m_str = move(input) } //member function

string& m_str; //declared as a private member
myclass (string input) : m_str(input); //class construction

但我想做的是

string m_str* //declared as a private member
func(string input) { m_str = input } //member function

问题

  1. 是否需要在 myclass 对象超出范围之前将 m_str 设置为 nullptr(即将其放入类析构函数中)?
  2. 我应该使用唯一指针而不是原始指针吗?

【问题讨论】:

  • 我并不是说原始指针是“坏的”,但是用它们很容易做坏事。如果您不需要转移所有权并且您的对象不会超过数据的寿命,那么原始指针应该不会造成任何问题。
  • 你可以考虑observer_ptr
  • @sp2danny 谢谢,关于observer_ptr的更多信息:stackoverflow.com/questions/24157735/…
  • @sp2danny 我错过了什么?我看不到 observer_ptr 比原始指针有任何优势。
  • 它声明了意图。如果仅用于观察者角色,原始指针是可以的。

标签: c++ pointers


【解决方案1】:

对于您的第一个问题,您不需要“重置”任何成员变量。该对象已被破坏,不应再次使用。

对于第二个问题,这取决于。大多数时候,您可以不将新的智能指针视为指针,而是从资源所有权的角度来看:一个资源可以同时拥有多个所有者 (std::shared_ptr),还是一次只有一个所有者 (std::unique_ptr)?如果您不打算转移所有权,那么实际上不需要使用智能指针,除非作为一个很好的自动删除指针。您应该问自己的更大问题是,您是否需要使用指针?很多时候,答案是“不”。

【讨论】:

    【解决方案2】:
    1. 不,您不需要在销毁时将指针类型分配给 nullptr

    2. 一旦input 超出范围,您的“或”案例将为您提供悬空引用。这是未定义的行为。

    3. 至于使用std::unique_ptr,请视情况而定。如果您想让多个事物“拥有”指针,std::shared_ptr 可能是一个更好的选择。

    【讨论】:

      【解决方案3】:

      由于您尝试解析std::string,您是否考虑过将迭代器传递给您的函数?这些可以简单地指向字符串中的空格,您的解析器当前正在读取。

      顺便说一句,我对函数中的函数设计不满意。考虑创建一个将这些函数作为私有成员函数的类。然后您可以将字符串作为类成员,并且每个函数都可以简单地使用相同的字符串实例。

      【讨论】:

      • 我正在创建一个具有私有成员函数的类,我会改进我的问题,以便清楚。
      • 迭代器是个好主意!是否有从迭代器从头到尾获取字符串的简写?例如我需要做类似"error, here is your string: " + input
      • std::begin(mystring)std::end(mystring):使用这些开始和结束迭代器初始化字符串的副本:std:.string{begin, end}
      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2014-04-02
      相关资源
      最近更新 更多