加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将指针设置为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 []是合法的并且无效.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读