Memmove制作一个现场垃圾?

Taz*_*ngo 0 c++

我正在使用一个位置向右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)

sya*_*yam 6

无论是memcpy也不memmove是可能的,当你的数组包含std::string的对象.原因是当它们不应该篡改对象的内部时(C++对象的完整性由其构造函数/赋值运算符/析构函数/成员函数确保,除非你确切地知道你是什么,否则你不能手动修改它的字节)做).

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

换句话说,一旦你开始使用C++对象,你就必须开始编写C++,而不是"C with classes".