houpengfei88 / Play-with-Data-Structures

波波老师的数据结构课程的C++代码实现,和波波老师的代码库目录一样:)
177 stars 61 forks source link

好像发现了一点小问题... #8

Open anyingiit opened 3 years ago

anyingiit commented 3 years ago

在Play-with-Data-Structures/02-Arrays/09-Amortized-Time-Complexity/Array.h:148中 https://github.com/houpengfei88/Play-with-Data-Structures/blob/89b4e005f3bdfb1720616957af0b30419aabd795/02-Arrays/09-Amortized-Time-Complexity/Array.h#L148

    void resize(int newCapacity) {
        T *newData = new T[newCapacity];
        for (int i = 0; i < size; ++i) {
            newData[i] = data[i];
        }
        data = newData;
        capacity = newCapacity;
        newData = nullptr;
        // 毕竟已经等于nullptr了, 释放一下好像也没有什么坏处,  但是我猜测这里你不是想干这件事, 因为nullptr不需要使用 []来释放
        delete []newData;
    }

这里是否应该释放oldData的数据, 而不是释放newData的数据? 因为data其实指向了newData? 自认为正确的代码

    void reSize(int newCapacity){
        auto *newData = new T[newCapacity];
        auto *oldData = data;
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }
        data = newData;
        capacity = newCapacity;
        delete []oldData;
    }

本人也是初学者, 如果说错了请见谅...

zhuyunfeng888 commented 2 years ago

在Play-with-Data-Structures/02-Arrays/09-Amortized-Time-Complexity/Array.h:148中

https://github.com/houpengfei88/Play-with-Data-Structures/blob/89b4e005f3bdfb1720616957af0b30419aabd795/02-Arrays/09-Amortized-Time-Complexity/Array.h#L148

    void resize(int newCapacity) {
        T *newData = new T[newCapacity];
        for (int i = 0; i < size; ++i) {
            newData[i] = data[i];
        }
        data = newData;
        capacity = newCapacity;
        newData = nullptr;
        // 毕竟已经等于nullptr了, 释放一下好像也没有什么坏处,  但是我猜测这里你不是想干这件事, 因为nullptr不需要使用 []来释放
        delete []newData;
    }

这里是否应该释放oldData的数据, 而不是释放newData的数据? 因为data其实指向了newData? 自认为正确的代码

    void reSize(int newCapacity){
        auto *newData = new T[newCapacity];
        auto *oldData = data;
        for (int i = 0; i < size; i++) {
            newData[i] = data[i];
        }
        data = newData;
        capacity = newCapacity;
        delete []oldData;
    }

本人也是初学者, 如果说错了请见谅...

qtw1998 commented 1 year ago

newData指针在调用delete[]之前被设置为nullptr,这是错误的做法,因为在这之后再调用delete[]就相当于对一个空指针进行删除操作,会导致未定义的行为。因此,需要将delete[]操作放在设置newData为nullptr之前,即:

delete [] newData; newData = nullptr; 因此,正确的代码应该是:

void resize(int newCapacity) { T *newData = new T[newCapacity]; for (int i = 0; i < size; ++i) { newData[i] = data[i]; } delete[] data; // 释放原内存 data = newData; capacity = newCapacity; } 这段代码使用delete[]释放原内存,然后将data指针指向newData所指向的新内存块,同时更新capacity的值。这样就完成了将数组空间的容量变成newCapacity大小的操作。

qtw1998 commented 1 year ago

image