【基础语法】【疑问】对空指针使用delete不应该是安全的吗

#include <iostream>
using namespace std;
class Rab {
    char* pt = NULL;
public:
    Rab(const char* t) {
        //构造函数
        char* back = new char[strlen(t) + 1];
        strcpy_s(back, strlen(t) + 1, t);
        pt = back;
        back = NULL;
    }
    ~Rab() {
        //析构函数 + 空置
        delete[] pt;
        pt = NULL;
    }
    bool Error1(Rab t) {
        //判断字符串是否相等
        return strcmp(this->pt, t.pt) == 0;
    }
};
int main() {
    Rab ta{ "SEU" };
    Rab te{ "THU" };

    ta.Error1(te);
    //system("pause");
    return 0;
}

上面这个程序里,error1()在退栈时释放了实参te的成员pt所指向的内存,并将其设置成了NULL。当main()函数退栈时,te的成员pt所指向的内存被再次释放,此时程序报错。
我的问题是,对空指针使用delete或delete[]不应该是安全的吗。为什么会报错呢。
(此处未用复制构造函数是有意而为之。)
希望大佬解惑!

if (!pt) delete[] pt;
如果pt == NULL或者已经被释放过,则不能再次释放。
道理很简单,释放过的地址,或者0地址,都不属于这个数组,怎么能释放呢。