【发布时间】:2011-03-06 08:16:22
【问题描述】:
这个问题让我很困惑。第一段代码可以正常工作而不会崩溃,它将 s1 分配给 s2 非常好。但是第二组代码导致程序崩溃。
有人知道为什么会发生这种情况或问题可能是什么吗?
代码 1:(有效)
s1.add(10, 30, 25, "Test Screen", false);
s1.add(13, 10, 5, "Name:XXX", false);
s1.add(13, 18, 30);
s1.remove(-1);
Screen s2 = s1;
代码 2:(分配时崩溃)
Screen s1;
if (1 != s1.add(10, 30, 25, "Test Screen", false))
message("first add() has a problem");
else if (2 != s1.add(13, 10, 5, "Name:XXX", false))
message("second add() has a problem");
else if (3 != s1.add(13, 18, 30))
message("third add() has a problem");
else if (3 != s1.remove(-1))
message("first remove() has a problem");
else {
Screen s2 = s1;
}
屏幕类的赋值运算符:
Screen& operator=(const Screen &scr) {
if (this != &scr){
for (int i = 0; i < 50; i++) {
if (fields[i])
delete fields[i];
fields[i] = new LField();
}
for (int i = 0; i < scr.numOfFields; i++)
fields[i] = scr.fields[i];
numOfFields = scr.numOfFields;
currentField = scr.currentField;
}
return *this;
}
字段类的赋值运算符:
LField& operator=(const LField &lfieldobj) {
if (this != &lfieldobj) {
if (lfieldobj.val) {
if (val)
delete[] val;
val = new char[strlen(lfieldobj.val) + 1];
strcpy(val, lfieldobj.val);
}
else{
//val = new char[1];
val = "";
}
rowNum = lfieldobj.rowNum;
colNum = lfieldobj.colNum;
width = lfieldobj.width;
canEdit = lfieldobj.canEdit;
index = lfieldobj.index;
}
return *this;
}
任何意见将不胜感激:)
【问题讨论】:
-
没有看到赋值运算符定义,这很可能无法回答。
-
您确定它会在作业中崩溃吗?
s2一创建就会超出范围,所以可能是析构函数的问题? -
我添加了赋值运算符定义。我是积极的克里斯,在崩溃的代码中,我已经注释掉了分配并且它工作正常。
-
尝试不使用析构函数的赋值。屏幕 &s2(*(新屏幕)); s2 = s1;也许
-
如果您的复制构造函数很好,则使用复制和交换 idum 作为赋值运算符。您当前使用的方法不提供异常安全性(如果分配出错,您当前无法对对象提供任何保证)。
标签: c++ operator-overloading assignment-operator operator-keyword