将指针设置为null会导致我的C程序崩溃
发布时间:2020-12-16 10:42:36 所属栏目:百科 来源:网络整理
导读:我有一个构造函数,它接收一个字符指针.如果它是空的,我需要将其成员变量设置为NULL,但是,当我尝试时程序在退出时崩溃. 我已经验证它到达将其设置为NULL的行,这是崩溃的原因. 我尝试过以下方法: val = NULL;val = 0;val = ""; 这些都导致崩溃,但如果我使用:
我有一个构造函数,它接收一个字符指针.如果它是空的,我需要将其成员变量设置为NULL,但是,当我尝试时程序在退出时崩溃.
我已经验证它到达将其设置为NULL的行,这是崩溃的原因. 我尝试过以下方法: val = NULL; val = 0; val = ""; 这些都导致崩溃,但如果我使用: val = new Char[1]; val = "o"; 它并没有崩溃. 有什么我不做的事吗? 更新: 这是我的问题的快速更新. 我正在使用的析构函数是: ~LField() { if (val) delete[] val; } 如果我拿出来: if (val) delete[] val; 那么程序在退出时不会崩溃: val = ""; 以下是一些需要的代码: LField(int rowNumVal,int colNumVal,int widthVal,const char *valVal = "",bool canEditVal = true) { if(strlen(valVal) > 0) { //doesn't jump in here since valVal is empty } else { val = ""; // this is where I'm trying to set a NULL value } } LField(const LField &clone) { if (val) delete[] val; val = new char[strlen(clone.val)]; strcpy(val,clone.val); rowNum = clone.rowNum; colNum = clone.colNum; width = clone.width; canEdit = clone.canEdit; index = clone.index; } LField& operator=(const LField &lfieldobj) { if (this != &lfieldobj) { if (val) delete[] val; val = new char[strlen(lfieldobj.val)]; strcpy(val,lfieldobj.val); rowNum = lfieldobj.rowNum; colNum = lfieldobj.colNum; width = lfieldobj.width; canEdit = lfieldobj.canEdit; index = lfieldobj.index; } return *this; } 改性: LField(int rowNumVal,const char *valVal = NULL,bool canEditVal = true) { if(valVal != NULL) { } else { val = NULL; } } LField(const LField &clone) { delete[] val; if (clone.val != NULL) { val = new char[strlen(clone.val) + 1]; strcpy(val,clone.val); } else val = NULL; rowNum = clone.rowNum; colNum = clone.colNum; width = clone.width; canEdit = clone.canEdit; index = clone.index; } LField& operator=(const LField &lfieldobj) { if (this != &lfieldobj) { delete[] val; if (lfieldobj.val != NULL) { val = new char[strlen(lfieldobj.val) + 1]; strcpy(val,lfieldobj.val); } else val = NULL; rowNum = lfieldobj.rowNum; colNum = lfieldobj.colNum; width = lfieldobj.width; canEdit = lfieldobj.canEdit; index = lfieldobj.index; } return *this; } ~LField() { delete[] val; } 我已经更新了代码.现在val要么用new []分配内存,要么是NULL,所以delete []不应该有问题.但是,它在退出时仍会崩溃. 解决方法
在复制构造函数中,您尝试删除[]未初始化的指针:
LField(const LField &clone) { //good code here,then... if (val) //<+ some random address here delete[] val;//<-undefined behavior } 只是不要这样做,跳过整个结构.在单元化对象上调用复制构造函数,没有资源可以“释放”. 您还尝试删除[]字符串文字,这是未定义的行为.请尝试以下更改: LField(int rowNumVal,bool canEditVal = true) { if(strlen(valVal) > 0) { //doesn't jump in here since valVal is empty } else { val = new char[1]; *val = 0; } } 以下是缓冲区溢出: val = new char[strlen(whatever)]; <-forgot to +1 for the null terminator strcpy(val,whatever); 还需要在删除[]之前检查空指针 – 空指针上的delete []是合法的并且无效. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |