我应该使用unique_ptr作为字符串吗?

时间:2018-02-09 11:12:10

标签: c++

我是C ++的新手。

我认为使用unique_ptr / shared_ptr是处理指针的“方法”,但是我应该将unique_ptr用于std::string吗?< / p>

5 个答案:

答案 0 :(得分:5)

你为什么要这样做?

std :: string对象管理&#34;包含&#34;的生命周期。字符串(内存字节)本身。

因为您不熟悉C ++。在你的函数/类方法中,我建议你在堆栈上创建对象: 像这样:

  std::string s;

而不是使用堆:

 std::string* s = new std::string();

当对象超出范围时,将销毁在堆栈上创建的对象。所以不需要智能指针。

您可以点击此链接了解更多信息:http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

答案 1 :(得分:2)

std::unique_ptr无需使用std::shared_ptrstd::string

您不必为简单的std::string分配内存。

std::string str = "abc";

就这么简单。不需要内存分配,因为std::string管理真实的&#39;字符串本身。

有些情况可能导致使用指针,尽管它可能是类/结构实例。

例如,考虑使用

std::unique_ptr<MyClass> p;

而不是

MyClass *p;

如果可能的话。

答案 2 :(得分:0)

您通常不需要指向字符串的指针,就像您通常不需要指向整数的指针一样。您可以只存储字符串值,也可以传递字符串值等。

但是如果您处于需要指向字符串的指针的特殊情况,那么是,std::unique_ptr<std::string>std::shared_ptr<std::string>优于std::string*

答案 3 :(得分:0)

std::unique_ptr确保不会意外复制和正确删除指向的对象。 由于您应该尽可能地避免动态分配,因此您可以简单地将std::string作为班级成员。如果它是返回值,正如已经指出的那样,字符串类足够聪明,可以以安全的方式正确地移动资源。 您不需要保证字符串是唯一的,我的意思是,不存在副本,因此唯一的ptr只是一个太强大的约束。 KIS规则:保持简单。

答案 4 :(得分:0)

通常,默认情况下,答案是“否”,如其他人所建议的那样。但是-有时答案可能是“可能是”!怎么会来?

  • 使用std::string,您将无法控制如何,何时以及由谁分配缓冲区。如果使用其他分配器(std::basic_string<char, MyAllocatorType>),虽然可以缓解这种情况-结果类为 not std::string;并且通常不会被采用std::string的函数接受。为此,进入分配器可能没有任何意义。
  • 更具体地说,您可以允许将基于唯一指针的字符串类创建为现有缓冲区的拥有包装。
  • 现在我们可以使用string_view了-它们甚至在C ++ 20(std::string_view)中都是标准的-您不必为唯一性而重写整个字符串类,基于指针的字符串;您需要做的就是在其上创建一个字符串视图,使用原始指针和大小(以字节为单位)(如果希望更好的空终止安全性,则使用大小-1。)并且如果您仍然希望使用std :: string方法,则它们将是一线客,例如
    std::string_view view() const { 
         return std::string_view{uptr_.get(), size_}; 
    }
    substr(size_type pos = 0, size_type count = npos) const { 
         return view().substr(pos, count); 
    }
    
  • 如果您想就地更新字符串同时保持其大小-std::string对您不起作用:要么完全恒定,要么大小和内容都可变。