假设我从自定义内存池中分配了一个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
}
我有两个问题
- 在方法结束时,std::string析构函数会试图删除它通过assign获得的my_pool_allocated_buffer吗?文档说它只会删除它通过自己的分配器分配的内存。
- 方法退出后,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"构造函数复制字符串,保留原始指针和内存。