gpt4 book ai didi

c++ - Memmove 使一个地方成为垃圾?

转载 作者:太空宇宙 更新时间:2023-11-04 14:44:38 28 4
gpt4 key购买 nike

我正在使用 memmovestd::string 元素向右移动一位。目的地的第一个地点是唯一一个乱七八糟、堆满垃圾的地方。我使用 memmove 而不是 strcpy 因为我在需要模板的类中使用它。当我有一个整数数组时它工作正常。关于如何为字符串修复此问题的任何想法?

/**
* @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);
}

我的主要

int main() {
DynamicArray<string> array(1);

string val1 = "val1";
array.add(val1);
string val2 = "val2";
array.add(val2);
// ... more additions ...

最后的输出:

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]

最佳答案

当您的数组包含 std::string 对象时,memcpymemmove 都不可能。原因是两者都在不应该篡改对象的内部(C++ 对象的完整性由其构造函数/赋值运算符/析构函数/成员函数确保,您不得修改其字节手动除非你确切地知道你在做什么)。

正如已经建议的那样,使用一种将构造函数、赋值运算符和析构函数考虑在内的方法(例如 std::copy_backward)或者更好的是,摆脱那些遗留的 C 数组并使用适当的 C++像 vector 这样的容器,并使用容器的函数来插入/删除项目。

换句话说,一旦您开始使用 C++ 对象,您就必须开始编写 C++,而不是“C with classes”。

关于c++ - Memmove 使一个地方成为垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443578/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com