У меня есть конструктор, который получает указатель на символ.Если оно пустое, мне нужно установить для его переменной-члена значение 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 [].Тем не менее, он по-прежнему падает на выходе.