我应该将unique_ptr用于字符串
Should I use unique_ptr for a string?
我是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_ptr
或std::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
对您不起作用:它的大小和内容都完全不变,或者是可变的。
- C++ 虽然语句不适用于字符串和"or"
- 函数模板不适用于字符串文本
- 我应该将unique_ptr用于字符串
- C++ rand() 不适用于字符串数组
- 用于字符串比较的动态编程
- 出乎意料的差执行时间,用于字符串串联函数
- 为什么 std::大写不适用于字符串?
- C 优化用于字符串比较和替换
- 为什么我可以重载 istream 的运算符>>用于字符串?
- "cout"不适用于字符串
- std::bind 不适用于字符串向量
- 在C++中创建用于字符串操作的哈希表
- C++预处理器如何用于字符串
- 如果函数调用导致引用传递,为什么要将共享指针用于字符串?
- c++中用于字符串优先级队列的未排序双链表
- c++中用于字符串数组的qsort
- 用于字符串的容器和用于匹配和计数的int型容器
- c++中是否有用于字符串的removeAt函数?
- 模板中的构造函数不同:一个用于字符串,另一个用于其他任何东西
- Str.compare()或(string)A == (string)B用于字符串比较