我是C ++的新手。
我认为使用unique_ptr
/ shared_ptr
是处理指针的“方法”,但是我应该将unique_ptr
用于std::string
吗?< / p>
答案 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_ptr
或std::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
对您不起作用:要么完全恒定,要么大小和内容都可变。