我应该将unique_ptr用于字符串

Should I use unique_ptr for a string?

本文关键字:用于 字符串 ptr unique 我应该      更新时间:2023-10-16

我是C 的新手。我听说使用unique_ptr/shared_ptr是"去"的"方法"。有关在堆上分配的数据的引用。因此,使用unique_ptr S代替std::string S?

是有意义的

你为什么要这样做?

std ::字符串对象本身管理"包含"字符串(内存字节(的寿命。

由于您是C 的新手。在您的功能/类方法中,我会建议您在堆栈上创建对象:喜欢:

  std::string s;

而不是使用堆:

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

当您的对象脱离范围时,在堆栈上创建的对象将被破坏。因此,不需要明智的指针。

您可以按照此链接了解更多信息:http://www.lealencpp.com/cpp-tutorial/79-the-stack-stack-and-theap/

无需使用std::unique_ptrstd::shared_ptr作为std::string

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

std::string str = "abc";

那样简单。不需要内存分配,因为std::string本身会管理"真实"字符串。


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

例如考虑使用

std::unique_ptr<MyClass> p;

而不是

MyClass *p;

如果可能的话。

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

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

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

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

  • 使用std::string,您无法控制如何,何时和由谁分配您的缓冲区。如果您使用其他分配器(std::basic_string<char, MyAllocatorType>(,则可以在某种程度上减轻这一点,但结果类是不是 std::string;通常不会被std::string s的功能所接受。仅仅为此目的进行分配可能没有意义。
  • 更具体地说,您可以允许创建基于独特的列的字符串类,作为现有缓冲区的拥有包装。
  • 现在我们可以使用string_view'S-甚至在C 20(std::string_view(中的标准中 - 您无需重写整个字符串类以用于基于独特的POINTER的字符串;您所需要的只是使用原始指针和字节中的大小(或大小-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对您不起作用:它的大小和内容都完全不变,或者是可变的。