C“期间不同结构指针之间的转换”;“模拟继承”; 嘿,我现在正在把C++程序移植到C中,当我用C++中的Struts模拟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); }

C“期间不同结构指针之间的转换”;“模拟继承”; 嘿,我现在正在把C++程序移植到C中,当我用C++中的Struts模拟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); },c,inheritance,casting,struct,free,C,Inheritance,Casting,Struct,Free,我已经试着运行了代码,它按照预期的方式工作(或者更确切地说,按照我希望的方式工作;)。但我的问题是,在如下类型转换之后,是否存在额外的“UserTask内存”被暴露的风险 Task* task = (Task*)newUserTask("A UserTask"); 当我转换回UserTask指针时,似乎没有问题 UserTask* utask = (UserTask*)task; 我假设当我为“一个用户任务”释放内存时,我就足以释放utask并使用deleteUserTask(utask)?

我已经试着运行了代码,它按照预期的方式工作(或者更确切地说,按照我希望的方式工作;)。但我的问题是,在如下类型转换之后,是否存在额外的“UserTask内存”被暴露的风险

Task* task = (Task*)newUserTask("A UserTask");
当我转换回UserTask指针时,似乎没有问题

UserTask* utask = (UserTask*)task;
我假设当我为“一个用户任务”释放内存时,我就足以释放utask并使用deleteUserTask(utask)?如果我改为使用deleteTask(task)释放task,我想UserTask特定的内存将不会被释放

<我的C++和C都是新的,以前使用java,动态内存分配仍然有点吓人…谢谢你的帮助


/Patrik

我认为在C中实现这一点的“正常”方法是将父结构内联,而不是作为指针,即:

struct Task{
  GenTask inhTask; 
};

这样,指向任务结构的指针可以向上转换为任务*。当然,“父”会随子实例一起自动释放

是的,我也见过。我没有这样做的原因是GenTask结构也包含指针(在实现过程中),我必须深入到其中以释放内存。但是,是的,我仍然看到它作为一个指针有点多余。可能会改变这一点。但是,在“指向任务结构的指针可以向上转换为任务*”的方式中,“任务”是什么意思呢。任何有GenTask的结构?谢谢你的回答。我的意思是,如果你有一个任务,你可以透明地把它当作一个绅士任务,而不必明确地取消引用。如果GenTask*有指向内存的指针,在删除结构时必须释放这些指针,那么您也必须为所有“子结构”执行此操作。