有没有办法生成一个std::字符串,它引用外部提供的缓冲区,但不拥有它



基本上,如果有一个预加载的缓冲区,用于一个以null结尾的字符串和要引用的长度,并希望将对它的引用传递到一个方法中,该方法采用std::string&但不复制字符串或拥有它,有可能这样做吗?

这将只具有有限的寿命,并且以这样一种方式进行管理,即它只有在缓冲区有效时才有效。

有没有办法生成一个引用外部提供的缓冲区但不拥有它的std::字符串?

否。

您有以下选项:

  1. 使用CCD_;外部";缓冲区
  2. 将外部缓冲区复制到字符串中
  3. 不要使用(引用(std::string作为参数。
    • std::string_view是典型的好选择。然而,创建非null终止的字符串视图非常容易,并且您的前提明确声明了null终止。如果这很重要,那么您可能需要避免使用字符串视图
    • 如果字符串视图不合适,那么可以使用const char*来指向以null结尾的字符串

基本上,对于非拥有字符串,答案是否定的。

然而,如果非拥有条件不是那么重要,那么您可以使用自己的分配器来引用特定的缓冲区。

您还可以使用std::pmr::string,它允许您提供自定义的memory_resource

想法如下:

#include <string>
#include <memory_resource>
#include <array>
#include <utility>
#include <iostream>
template<std::size_t size>
class StackBufferResource {
public:
auto as_resource() {return &m_resource;}
auto address() {return m_buffer.data();}
private:
std::array<std::byte, size> m_buffer{};
std::pmr::monotonic_buffer_resource m_resource{m_buffer.data(), size};
};
int main() {
StackBufferResource<512> buffer;
std::pmr::string myString("My name is Antoine and I am not sure for this answer", buffer.as_resource());
std::cout << myString << "n";
std::cout << (const char*)buffer.address() << std::endl;
}

CCD_ 7是一个不断增长的CCD_。这意味着解除分配是一种;没有操作";。

这样一个东西的好处是,你可以把同样的东西给std::pmr::vector

但是,您可能需要注意以下几点:

CCD_ 10使用CCD_。由于它是一个微不足道的对象,我认为(尽管我不确定(在字符串被破坏后访问缓冲区内存是安全的。如果它是一种不可破坏的类型,我认为可以看到垃圾值。

相关内容

  • 没有找到相关文章

最新更新