gpt4 book ai didi

c++ - 如何在不复制的情况下使用 std::string?

转载 作者:可可西里 更新时间:2023-11-01 18:20:04 26 4
gpt4 key购买 nike

我有一个类说,

class Foo
{
public:
void ProcessString(std::string &buffer)
{
// perform operations on std::string

// call other functions within class
// which use same std::string string
}

void Bar(std::string &buffer)
{
// perform other operations on "std::string" buffer
}

void Baz(std::string &buffer)
{
// perform other operations on "std::string" buffer
}
};

此类尝试使用 std::string 缓冲区在这些条件下使用各种方法对其执行操作:

  • 我不想传递我已经拥有的 std::string 的拷贝。
  • 我不想创建此类的多个对象。

例如:

// Once an object is created
Foo myObject;

// We could pass many different std::string's to same method without copying
std::string s1, s2, s3;
myObject.ProcessString(s1);
myObject.ProcessString(s2);
myObject.ProcessString(s3);

我可以使用该字符串并将其分配为类成员,以便使用的其他函数可以知道它。

但似乎我们不能有一个引用类成员 std::string &buffer 因为它只能从构造函数中初始化。

我可以使用指向 std::string 的指针,即 std::string *buffer 并将其用作类成员,然后传递 的地址s1, s2, s3.

class Foo
{
public:
void ProcessString(std::string *buf)
{
// Save pointer
buffer = buf;

// perform operations on std::string

// call other functions within class
// which use same std::string string
}

void Bar()
{
// perform other operations on "std::string" buffer
}

void Baz()
{
// perform other operations on "std::string" buffer
}
private:
std::string *buffer;
};

或者,另一种方法是将对 std::string 缓冲区的引用传递给每个函数,正如上面第一个示例中所示

这两种方法似乎都有点难看,因为我很少看到将 std::string 用作指针或传递所有类的函数相同的参数。

有没有更好的办法或者我正在做的就很好?

最佳答案

在 MyObject 中保留指向不属于您的对象的字符串的引用或指针是危险的。很容易得到讨厌的未定义行为

看下面的合法例子(Bar是public的):

myObject.ProcessString(s1);     // start with s1 and keep its address
myObject.Bar(); // works with s1 (using address previously stored)

看下面的UB:

if (is_today) {
myObject.ProcessString(string("Hello")); // uses an automatic temporary string
} // !! end of block: temporary is destroyed!
else {
string tmp = to_string(1234); // create a block variable
myObject.ProcessString(tmp); // call the main function
} // !! end of block: tmp is destroyed
myObject.Bar(); // expects to work with pointer, but in reality use an object that was already destroyed !! => UB

错误非常严重,因为在读取函数的用法时,一切似乎都很好并且管理得很好。自动销毁 bloc 变量隐藏了这个问题。

所以如果你真的想避免字符串的复制,你可以像你设想的那样使用一个指针,但是你应该只在 ProcessString() 直接调用的函数中使用这个指针,并将这些函数设为私有(private)。

在所有其他情况下,我强烈建议重新考虑您的立场,并设想:

  • 将使用它的对象中字符串的本地拷贝。
  • 或者在所有需要它的对象函数中使用一个string&参数。这避免了拷贝,但将组织字符串的适当管理的责任留给了调用者。

关于c++ - 如何在不复制的情况下使用 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com