C ++现代字符串指针

时间:2016-12-17 16:45:12

标签: c++ string c++11 pointers

是否建议在现代c ++字符串上使用指针? 像这样:

std::string *test = new string();
anyfunction(test);

测试变量中是一个很长的文本。所以我想,使用指针操作会更容易,更快捷。

这是好的还是坏的代码?

4 个答案:

答案 0 :(得分:3)

一般来说,这是一个非常糟糕的主意 - 有两个原因:

次要原因:您正在使用手动堆分配而不将其包装在智能指针中。但是添加例如std::unique_ptr只会在症状上加上创可贴。

主要原因:您正在考虑正确的方向(避免使用大量数据的不必要副本),但您使用的是错误的工具。函数参数的类型是正确的工具。

该函数是否只需要读取字符串?然后它的签名应该是:

return_type anyfunction(const std::string& test);

通过const ref传递不会复制字符串。如果您还需要写访问权限,请忽略const

return_type anyfunction(std::string& test);

同样,没有复制。将字符串移动到函数中也可能是一个选项。但如果没有进一步的背景,很难说。

答案 1 :(得分:1)

std :: string基本上是在堆上创建的。一些优化版本会在堆栈上创建短字符串以提高速度,但这不是问题。

建议不要使用new进行创建,因为该对象超出范围时无法自动销毁。 (有时你想要这种行为,但这种情况很少见,实际上你应该认为新的C ++程序员已经过时了)。并且它不会显着影响您的堆栈使用,因为堆栈中只有几个微不足道的控制变量。

您尚未展示如何初始化它。或者您打算如何使用这些数据。传递const std :: string&实际上只是传递指针的替代符号,它更具惯用性。然而,现代C ++正在转向字符串视图。基本上,您创建字符串,然后创建数据视图。如果字符串很长,这可能很重要。例如,如果长字符串是胖数组,那么在长字符串上搜索短子字符串非常耗时,如果它是后缀树则非常快。

字符串视图仍然是实验性的: http://en.cppreference.com/w/cpp/experimental/basic_string_view

答案 2 :(得分:1)

使用指针意味着另一个间接层。 C ++ 11具有移动语义意味着可以轻松移动字符串的副本而无需执行深层复制,这大部分消除了new字符串或任何其他C ++对象的需要。

答案 3 :(得分:-1)

在现代C ++中不建议使用原始指针。相反,您可以使用智能指针。 C ++ 11-std :: auto_ptr,std :: unique_ptr中有四个智能指针, std :: shared_ptr和std :: weak_ptr。 所有这些都旨在帮助管理动态分配对象的生命周期,即通过确保在适当的时间以适当的方式销毁此类对象来避免资源泄漏(包括 如果发生例外)。