Проблема в следующем: в конце этой функции элементы элемента «tasks [taskCount]», такие как имя, срок выполнения и т. Д., Действительно являются тем, что было передано в эту функцию, но после возврата к вызывающей функции этой функции.все эти значения становятся мусором, кроме taskcount, который не является динамическим.Эта функция определена в области видимости класса «Tasklist»
void addTask(char name[],char course[],char dueDate[]){
taskCount++;
Task task(taskCount, name, course, dueDate);
tasks[taskCount] = task;
}
Вот краткое определение класса «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;
}
};
Я почти уверен, что происходитзаключается в том, что эта функция освобождает свою локально объявленную переменную «task» после возврата к вызывающей стороне, которая вызывает деструктор задачи, освобождая тем самым память, на которую ссылался массив «tasks» для каждого из элементов своего элемента (name, due, course).
Итак, как я могу предотвратить это?
Итак, по совету многих полезных людей на этом сайте, теперь у меня есть это в моем определении класса Задачи:
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);
}
Так что это должно учитывать одно из трех правил, верно?