类解构函数和指针

Class deconstructor and pointers

本文关键字:指针 函数      更新时间:2023-10-16

我们在大学里写了一段代码(学习面向对象程序(。我们写了这门课,问题是,根据我和我们的老师的理解,程序应该在以下情况下崩溃,但就我而言,它不会。

问题是这条线是罪魁祸首

DynamicArray d, f;
f = d;

根据他的说法(附加了其余代码(,因为当 main 结束时,解构函数删除 f 然后转到 d,但由于指针在两种情况下都指向相同的 mem 位置,现在它应该在尝试删除它时给出错误,因为那里什么都没有......但是我的编译器完美地运行了代码。我正在使用 gcc 编译器。Denconstructor 在类的末尾,其余的就是填充动态数组。

#include <iostream>
#include <ctime>
class DynamicArray{
private:
    int *arr;
    int size, cap; //cap is the physical size, size is number of elements
public:
    DynamicArray(){
        arr = nullptr;
        size = cap = 0;
    }
    DynamicArray(int i){
        cap = i;
        size = 0;
        arr = new int[cap];
    }
    void pushback(int j){
        if(cap == 0){
            arr = new int[cap];
            arr[0] = j;
            size++;
            cap++;
        }
        else if(size < cap){
            arr[size] = j;
            size++;
        }
        else if(size == cap){
            int *arr2 = new int[cap * 2];
            int i;
            cap *= 2;
            for(i = 0; i < size; i++){
                arr2[i] = arr[i];
            }
            arr2[i++] = j;
            delete[] arr;
            arr = arr2;
        }
    }
    void print(){
        for(int i = 0; i < size; i++)
            std::cout << arr[i] << " ";
    }
    ~DynamicArray(){
        if(arr != nullptr)
            delete[] arr;
    }
};
int main(){
    DynamicArray d, f;
    srand(time(nullptr));
    int n = rand() % 5;
    for(int i = 0; i < n; i++){
        d.pushback(rand() % 10);
    }
    f = d;
    f.print();
    std::cout << std::endl;
    d.print();
    return 0;
}

您的代码会导致所谓的"未定义行为"。基本上,这意味着任何事情都可能发生,包括什么都没有发生,或者无论发生什么都不容易观察到。对于"未定义行为"的更精确定义,您必须检查例如C++标准,但这里也有很多关于该术语的讨论。

尝试使用以下命令运行代码 valgrind,它会告诉你你的代码被破坏了。