【发布时间】:2011-10-12 03:56:52
【问题描述】:
这个问题:在这个函数的最后,“tasks[taskCount]”元素的成员名字,截止日期等,确实是传递给这个函数的,但是在返回给这个函数的调用者之后,所有这些值都变成垃圾,除了不是动态的taskcount。这个函数是在类“Tasklist”的范围内定义的
void addTask(char name[],char course[],char dueDate[]){
taskCount++;
Task task(taskCount, name, course, dueDate);
tasks[taskCount] = task;
}
以下是“任务”类的简要定义:
class Task
{
private:
int number;
char* name;
char* dueDate;
char* course;
public:
Task(){
name = new char[TEXT_SIZE + 1];
dueDate = new char[TEXT_SIZE + 1];
course = new char[TEXT_SIZE + 1];
saveText = new char[(TEXT_SIZE * 3) + 1];
};
Task(int num, char n[], char c[], char d[]){
number = num;
name = new char[strlen(n) + 1];
dueDate = new char[strlen(d) + 1];
course = new char[strlen(c) + 1];
strcpy(name, n);
strcpy(dueDate, d);
strcpy(course, c);
};
~Task(){
delete [] name;
delete [] dueDate;
delete [] course;
delete [] saveText;
}
};
我很确定发生了什么是这个函数在返回到调用者之后处理其本地声明的变量“任务”,调用者调用了任务的析构函数 从而释放“tasks”数组为它的每个元素的成员(名称、到期、课程)引用的内存。
那么,我该如何防止这种情况发生呢?
因此,根据本网站上许多乐于助人的人的建议,我现在在我的任务类定义中添加了这个:
Task(const Task& t){
name = new char[TEXT_SIZE + 1];
dueDate = new char[TEXT_SIZE + 1];
course = new char[TEXT_SIZE + 1];
saveText = new char[(TEXT_SIZE * 3) + 1];
number = t.number;
strcpy(name, t.name);
strcpy(dueDate, t.dueDate);
strcpy(course, t.course);
strcpy(saveText, t.saveText);
}
所以这应该是三个规则之一,对吧?
【问题讨论】:
-
提及“Task”类的字符串成员这样定义可能会有所帮助:
-
什么?你的评论被截断了吗?
-
使用 std::string。如果您仍在摆弄三规则,那么您就错过了:
Task& operator=(Task t) { swap(number, t.number); swap(name, t.name); swap(dueDate, t.dueDate); swap(course, t.course); swap(saveText, t.saveText); return *this;}
标签: c++ memory pointers dynamic