将std :: string删除它在析构函数中通过assign方法获取的内容

use*_*009 2 c++ move stdstring c++11

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

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

我有两个问题.

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

Mik*_*our 5

在方法结束时,std::string析构函数是否会尝试删除my_pool_allocated_buffer通过assign获取的内容?

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

使用std::move对此有何影响?

不,std::move这里没有效果(除了令代码混淆的读者).如果有一个重载assign接受了对指针的右值引用,那么就会选择它; 但没有这样的超载,所以它没有任何区别.

(顺便说一句,这样一个过载来获取原始指针的"所有权"将是一个非常糟糕的主意,因为无法知道原始指针是否意图"拥有"其目标,或者只是引用它.通常应该使用智能指针来表达所有权,以及原始指针没有所有权的约定.)