【发布时间】:2012-03-05 11:02:34
【问题描述】:
嘿,我目前正在将 C++ 程序移植到 C 中,当我使用 C 中的结构模拟从 C++ 类的继承时,我使用以下代码进行了简化。
typedef struct GenTask GenTask;
typedef struct Task Task;
typedef struct UserTask UserTask;
struct GenTask{
char name[MAXCHAR];
boolean isUserTask;
int k;
void (*print)(Task*);
};
GenTask* newGenTask(const char* n){
GenTask* inhTask = (GenTask*)malloc(sizeof(GenTask));
strncpy(inhTask->name, n, MAXCHAR);
inhTask->k = 1;
return inhTask;
}
struct Task{
GenTask* inhTask;
};
void printTask(Task* task){
printf("\nThis is Task: %s",task->inhTask->name);
}
Task* newTask(const char* n){
Task* task = (Task*)malloc(sizeof(Task));
task->inhTask = newGenTask(n);
task->inhTask->isUserTask = false;
task->inhTask->print = printTask;
return task;
}
void deleteTask(Task* task){
free(task->inhTask);
free(task);
}
struct UserTask{
GenTask* inhTask;
int m;
};
void printUserTask(Task* task){
UserTask* ut = (UserTask*)task;
printf("\nThis is UserTask nbr: %d",ut->m);
}
UserTask* newUserTask(const char* n){
UserTask *ut = (UserTask*)malloc(sizeof(UserTask));
ut->inhTask = newGenTask(n);
ut->inhTask->isUserTask = true;
ut->inhTask->print = printUserTask;
ut->m=100;
return ut;
}
void deleteUserTask(UserTask* utask){
free(utask->inhTask);
free(utask);
}
我已经尝试运行代码并且它按预期工作(或者更确切地说,正如我希望它工作的那样;))。不过,我的问题是,在像下面这样的类型转换之后是否存在额外的“UserTask-memory”暴露的风险。
Task* task = (Task*)newUserTask("A UserTask");
当我转换回 UserTask 指针时似乎没有问题。
UserTask* utask = (UserTask*)task;
我假设当我为“A UserTask”释放内存时,我足以释放 utask 并使用 deleteUserTask(utask)?如果我改为使用 deleteTask(task) 释放任务,我猜 UserTask 特定的内存将不会被释放。
我是 C++ 和 C 的新手,之前一直在使用 Java,动态内存分配仍然有点吓人...感谢您的帮助!
/帕特里克
【问题讨论】:
标签: c inheritance casting struct free