Xnew! 2020-03-13 23:25 采纳率: 100%
浏览 221
已采纳

【基础语法】【疑问】对空指针使用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[]不应该是安全的吗。为什么会报错呢。
(此处未用复制构造函数是有意而为之。)
希望大佬解惑!

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-03-14 12:06
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波