std::string会删除在析构函数中通过assign方法获得的内容吗?



假设我从自定义内存池中分配了一个char*,并填充了必要的数据。我在std::string类的赋值方法中使用char*,并确保使用std::move来调用move变量。

void DoWork(char* my_pool_allocated_buffer) {
    std::string s;
    s.assign(std::move(my_pool_allocated_buffer));
    //do some work with s
}

我有两个问题

  1. 在方法结束时,std::string析构函数会试图删除它通过assign获得的my_pool_allocated_buffer吗?文档说它只会删除它通过自己的分配器分配的内存。
  2. 方法退出后,my_pool_allocated_buffer将被它的池释放。使用std::move对这有任何影响吗?(假设池不关心缓冲区保存的实际数据)。

在方法结束时,std::string析构函数会试图删除它通过赋值获得的my_pool_allocated_buffer吗?

没有,因为它没有获取缓冲区。它将内容复制到自己的托管缓冲区中。

使用std::move对这有影响吗?

不,std::move在这里没有作用(除了使代码的读者感到困惑之外)。如果assign重载接受对指针的右值引用,则选择;但是没有这样的重载,所以没有什么区别。

(顺便说一句,这样一个获取原始指针"所有权"的重载将是一个非常糟糕的主意,因为没有办法知道原始指针是打算"拥有"它的目标,还是只是引用它。您通常应该使用智能指针来表示所有权,同时遵循一个约定,即原始指针不具有所有权。

当你在字符串上调用assign时,它会将数据从提供的缓冲区复制到字符串中。它不再与原始数据的来源有任何连接。当字符串超出作用域时,它的析构函数会自动清除字符串。您的原始缓冲区不受此影响。

我不是c++ 11中新移动的东西的专家,但我感觉你在这里的用法是错误的。我认为它只会移动char *指针,这与复制它相同。它不会对原始数据产生任何影响。

这是一个关于std::move的常见误解:它不移动任何东西,它只不过是一个右值强制转换(如果你想了解更多,你可以看看这个问题。

在您的情况下,您仍然调用正常的string::assign(char*)函数。在标准库引用中查看,值被复制。

6)将内容替换为s指向的以空结尾的字符串的内容。>字符串的长度由第一个空字符决定。

那么,文本将被复制,并且char*和s

之间没有链接

如果你看一下这个std::basic_string构造函数引用,你会发现没有构造函数接受对指针的通用引用。这意味着std::move调用不起作用,使用普通的"char-pointer"构造函数复制字符串,保留原始指针和内存。

最新更新