C++使用delete[]删除结构数组



在向cpp中的数组添加结构时遇到问题。我提出了这个方法,它在int上很有效,但当我想在结构上做同样的事情时,我在添加3个或更多后会出错。我对它进行了一点调试,似乎delete[]导致了错误消息";分段故障(堆芯转储(";。我不能使用stl中的矢量或列表,所以不要建议使用以下代码:

struct sth
{
    unsigned int id;
    std::string name;
};
unsigned int id_counter = 0;
unsigned int counter_int = 0;
sth *array = new sth[0];
void print_array()
{
    for (int i = 0; i < counter_int; ++i)
    {
        std::cout << array[i].id << ' ' << array[i].name << " -- ";
    }
    std::cout << 'n';
}
void add_sth(sth value)
{
    sth *newArr = new sth[counter_int + 1];
    memcpy(newArr, array, counter_int * sizeof(sth));
    delete[] array;
    array = newArr;
    array[counter_int] = value;
    ++id_counter;
    ++counter_int;
}
int main(int argc, char const *argv[])
{
    sth e1 = {1, "abc1"};
    sth e2 = {2, "abc2"};
    add_sth(e1);
    add_sth(e2);
    add_sth(e2);
    print_array();
}

问题可能是试图用memcpy复制std::string

std::string不是POD(纯旧数据(对象,一些编译器和当然,静态代码分析器(例如SonarQube或Klocwork(会提醒您你所做的是错误的。

要正确完成复制,您应该定义一个赋值运算符,并逐个复制项目,或者只使用动态容器,例如std::vector

sth结构有一个std::string成员,因此使用memcpy将无法正常工作,因为sth在一般情况下是不可复制的。memcpy函数对包含非POD成员的C++或C++类一无所知。

在C++中,可以将memcpy替换为std::copy:

#include <algorithm>
//...
std::copy(array, array + counter_int, newArr);

如果一个好的C++编译器检测到类型是可复制的,那么它会将std::copy转换为memcpy。否则,编译器将使用循环简单地复制对象。

最新更新