C++ 调整C+的大小+;双指针数组

C++ 调整C+的大小+;双指针数组,c++,C++,我试图调整C++中指针数组的大小,但是在调整大小之后,我遇到了一个分割错误。 我的调整大小代码如下所示: CustomClass **arr; int capacity = 20; ... void resize(size_t new_capacity) { CustomClass** resized_arr = new CustomClass*[new_capacity]; memcpy(resized_arr, arr, new_capacity * sizeof(Cust

我试图调整C++中指针数组的大小,但是在调整大小之后,我遇到了一个分割错误。

我的调整大小代码如下所示:

CustomClass **arr;
int capacity = 20;
...
void resize(size_t new_capacity) {
    CustomClass** resized_arr = new CustomClass*[new_capacity];

    memcpy(resized_arr, arr, new_capacity * sizeof(CustomClass));

    delete [] arr;

    capacity = new_capacity;

    arr = resized_arr;

    print(); // segmentation fault while printing half way through the hash array

}

void print() {
    for (int i = 0; i < capacity; i++) {
        if (arr[i] != NULL) {
            cout << "KEY: " << i << ", VAL: " << arr[i]->to_string() << endl; // the to_string() seg faults
        }
    }
}

string to_string() { return a + " of " + b; } // a and b are strings
CustomClass**arr;
国际通行能力=20;
...
调整空隙大小(大小\u t新容量){
CustomClass**resized_arr=新CustomClass*[新容量];
memcpy(调整大小的arr、arr、新容量*sizeof(自定义类));
删除[]arr;
容量=新的容量;
arr=调整大小的\u arr;
print();//在哈希数组中打印一半时出现分段错误
}
作废打印(){
对于(int i=0;i
memcpy(resized_arr, arr, new_capacity * sizeof(CustomClass));
应该是:

memcpy(resized_arr, arr, new_capacity * sizeof(CustomClass*));

请注意,通过使用
std::vector
std::vector
而不是原始数组,可以避免许多不必要的痛苦。

您在
memcpy
中复制了错误的字节数,并且新元素需要初始化为NULL。用以下语句替换现有的
memcpy
调用s:

memcpy(resized_arr, arr, capacity * sizeof(*resized_arr));
for (size_t c = capacity; c < new_capacity; ++c)
     resized_arr[c] = nullptr;
但这更容易出错,如果新容量小于旧容量,就会出现问题

您可以将memcpy替换为

for (size_t c = 0; c < capacity; ++c)
    resized_arr[c] = arr[c];
(尺寸c=0;c
避免错误获取
成员集的问题。编译器在优化时,可能会以任何方式生成相同的代码。

您的
打印()
方法失败,因为当您创建
CustomClass*
指针的新数组时,您没有对它们进行零初始化,因此,在打印时对
nullptr
的检查失败,并且在无效指针上调用
to_string()

所以第一件事是第一件事:

CustomClass** resized_arr = new CustomClass*[new_capacity](); 
注意
()
最后,这将确保所有指针都为空。要将
memcpy
旧数组复制到新数组中,您需要知道要复制多少字节,这将是
CustomClass*
指针中的旧容量*字节,因此

memcpy(resized_arr, arr, capacity * sizeof(CustomClass*));

下面是一个这样工作的例子:

不幸的是,我需要为此项目使用数组并调整其大小。我尝试使用
sizeof(CustomClass*)
,但它产生了与使用
sizeof(*resized_arr)
相同的seg错误,并且新数组元素需要初始化为NULL。@1201programalm使用
sizeof(*resized_arr)
似乎正在工作。@1201programalam发现了另一个问题——较大的数组末尾有未通过memcpy()调用设置的项;您需要手动初始化它们(使用for循环或memset())确保它们正确为空且不包含未初始化/任意值。
memcpy
不会复制比
arr
更多的字节,因为我们将新的大小指定为要复制的字节数吗?如果我们使用
sizeof(*resized_arr)
,它不应该是
sizeof(*arr)
memcpy
memset
为我造成了各种错误,但是简单的
for循环
工作得非常好。
memcpy(resized_arr, arr, capacity * sizeof(CustomClass*));