【发布时间】:2010-07-07 12:38:39
【问题描述】:
我有一个构造函数,它接收一个字符指针。如果它为空,我需要将其成员变量设置为 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, int colNumVal, int widthVal, 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[] 应该没有问题。但是,它仍然在退出时崩溃。
【问题讨论】:
-
向我们展示整个类,或者至少展示构造函数、析构函数、复制构造函数和赋值运算符。
-
是的,添加更多代码。没有就很难看到任何东西。
-
sharptooth 很好地回答了这个问题,所以我将在这里添加进一步的评论。在调用
delete[]之前,您不需要进行非空检查;delete运算符会为您执行 null 检查,如果指针为 null,则不执行任何操作。 -
当
valVal不为空时,“修改”构造函数将val设置为什么? -
你仍然在复制构造函数中有
if (val) delete[] val。去掉它。完全地。请!