微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将动态数组转移到新的动态数组,删除充满动态对象的动态数组

如何解决将动态数组转移到新的动态数组,删除充满动态对象的动态数组

如果我创建了一个动态的 Zebra 数组,然后说,我创建了一个新的 Temp 数组,我想在其中传输原始数组中的对象。

然后我将指针从原始数组移动到 Temp。我需要在移动数组 = temp 之前删除旧的数组项吗?

此外,我似乎泄漏但不知道为什么,我似乎同时删除了数组和指针。

class Zebra {

public:
    //int age = 0;

};

int main() {
    
    Zebra** array = new Zebra * [10];

    for (int i = 0; i < 10; i++) {
        array[i] = new Zebra;
    }

    Zebra** temp = new Zebra * [20];
    for (int i = 0; i < 10; i++) {
        temp[i] = array[i];
    }
    // do i need to delete the old array items before move array = temp?
    array = temp;
    delete[]temp;
    temp=NULL;

    for (int i = 0; i < 10; i++) {
        delete[]array[i];
        array[i]=NULL;
    }

    
    delete[]array;

    array= NULL;
}

解决方法

你有你要向后删除的东西,你想要:

    delete[] array;
    array = nullptr;
    
    array = temp;

    for (int i = 0; i < 10; i++) {
        delete array[i];
        array[i] = NULL;
    }
    delete[] array;
    array = NULL;

请注意,您还错误地使用了 delete[],其中 delete 应该单独用于释放 array[i] 元素。

为什么会这样?

最初您为指针 array 分配了一个内存块,其中包含十个指向 Zebra 的指针。然后当您创建 temp 两倍大的 array 并将 array 中的每个指针分配给 temp 时,您的 temp 保存每个 {{1} 的起始地址}}(其中array[i])。

您所做的只是0 <= i < 10,它释放了保存原始存储空间的内存块,用于delete[] array 指向10 的指针。当您分配 Zebra 现在数组指向 array = temp; 指向 20 的指针的新内存块。

所以在您的重新分配方案中,您刚刚创建了一个更大的指针块,将所有从 Zebra 分配给 array,删除了原始指针块,并将新的指针块分配给 { {1}}(完成)。 (本质上是在做 temp 在 C 中所做的)

完整的例子是:

array

内存使用/错误检查

realloc()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。