我正在使用一个位置向右memmove
移动std::string
元素.目的地的第一个地方是唯一被弄乱并充满垃圾的地方.我正在使用memmove
而不是strcpy
因为我在需要模板的类中使用它.当我有一系列的int时,它工作正常.有关如何修复字符串的任何想法?
/**
* @brief Shifts elements in the array to the right
* @param newItem The insert position.
*/
template<class T>
void DynamicArray<T>::shiftElementsRight(uint newItem) {
uint diff = _size - newItem;
memmove(&(_array[newItem + 1]),
&(_array[newItem]), sizeof(_array[0]) * diff);
}
Run Code Online (Sandbox Code Playgroud)
我的主要
int main() {
DynamicArray<string> array(1);
string val1 = "val1";
array.add(val1);
string val2 = "val2";
array.add(val2);
// ... more additions ...
Run Code Online (Sandbox Code Playgroud)
最后一个输出:
Sizeof: 8
Value is: val1
Value is: val11val3, val21
????[val1, val2A????[val1, val2, val31val4, Aq?????[val1, val2, val3 val4, val5Q`r?#????[val1, val2, val3, val4, val5, val61val5, 1val6, Q"????[val1, val2, val3, al4, a
8s??p?hp??p?hq?(r?Xr??KC??KC??KC?1val7, a:????[val1, val2, val3, val4, val5, qF????[val1, val2, val3, val4, val5, val6]
Run Code Online (Sandbox Code Playgroud)
无论是memcpy
也不memmove
是可能的,当你的数组包含std::string
的对象.原因是当它们不应该篡改对象的内部时(C++对象的完整性由其构造函数/赋值运算符/析构函数/成员函数确保,除非你确切地知道你是什么,否则你不能手动修改它的字节)做).
正如已经建议的那样,使用一种方法,将构造函数,赋值运算符和析构函数考虑在内(std::copy_backward
例如)或更好,摆脱那些遗留的C数组并使用正确的C++容器,vector
并使用容器的函数来插入/删除项目.
换句话说,一旦你开始使用C++对象,你就必须开始编写C++,而不是"C with classes".
归档时间: |
|
查看次数: |
202 次 |
最近记录: |