为字符串类型崩溃在动态数组中执行擦除

问题描述 投票:0回答:2

我正在尝试使用模板类在C ++中为字符串,int,ulong等类型实现stl矢量。以下找到的擦除功能对于除字符串以外的所有其他数据类型均能正常工作。

template <typename T>
void myArr<T>::erase(ULONG index)
{
    if(index >= count)
        return;
    T* temp_arr = new T[max_count];
    if(index == 0)
    {
        memcpy(temp_arr,(arr+1),(count-1)*sizeof(T));
    }
    else if(index == count-1)
    {
        memcpy(temp_arr,arr,(count-1)*sizeof(T));
    }
    else
    {
        memcpy(temp_arr,arr,(index-1)*sizeof(T));
        memcpy(temp_arr+index,arr+index+1,(count-index)*sizeof(T));
    }
    delete[] arr;
    arr = temp_arr;
    count--;
}

[当字符串是数组类型时,程序因内存访问冲突0x0005而崩溃。如何处理字符串数据类型。.]

c++ arrays string memcpy
2个回答
1
投票

您不能在非平凡可复制类型上使用memcpystd::string不可复制,因此无法在其上使用。

您需要做的是根据容器所拥有的类型,使用擦除呼叫特殊版本的擦除。如果是普通类型,则调用使用erasememcpy版本。如果不是,则调用使用for循环并进行简单复制/移动操作的erase版本。


0
投票

您不能将memcpy()用于非平凡类型,例如std::string,可能需要将内部数据从一个实例复制到另一个。在这种情况下,您需要改用std::copy(),它针对琐碎的类型进行了优化,对于“琐碎的类型”进行了“正确的处理”:

std::copy()

或者,由于您的类似乎对数组具有容量与计数的概念,因此您实际上根本不需要分配新的数组,您可以简单地内联修改现有数组以减少其计数而不影响其容量(这基本上是template <typename T> void myArr<T>::erase(ULONG index) { if (index >= count) return; T* temp_arr = new T[max_count]; std::copy(arr, arr + index, temp_arr); std::copy(arr + (index+1), arr + count, temp_arr + index); delete[] arr; arr = temp_arr; --count; } 的功能):

std::vector::erase()
© www.soinside.com 2019 - 2024. All rights reserved.