std::string会删除在析构函数中通过assign方法获得的内容吗?
Will std::string delete contents it aquired through assign method in the destructor
假设我从自定义内存池中分配了一个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"构造函数复制字符串,保留原始指针和内存。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- 为什么 std::string_view 没有 assign() 和 clear() 方法?
- 在没有警告(或编译指示)的情况下进行便携式"assign within conditional expressions"的好方法?
- 使用assign、substring和find方法分析空白处的字符串
- 在C++中,如何在没有变量assign的情况下调用方法
- 使用assign()是初始化我的c++结构向量的好方法吗?
- std::string会删除在析构函数中通过assign方法获得的内容吗?