【问题标题】:Why does freeing a pointer cause program to abort?为什么释放指针会导致程序中止?
【发布时间】:2014-10-27 16:26:09
【问题描述】:

我一直在为个人项目使用函数指针和结构。当我编译并运行我的代码时,当我尝试释放指针时出现“中止(核心转储)”错误。

我有以下代码(不包括导入):

typedef int (*intFunction)(int,int);  

typedef struct {
    int value;
    intFunction func;
} ValueFunc;

int addInts(int a, int b){
    return a + b;
}

int main(){
    ValueFunc vf;
    vf.value = 3;
    vf.func = &addInts;
    int y = vf.func(vf.value,4);
    printf("%i",y);
    free(vf.func);
    return 0;
}

如果有人能解释为什么会发生这种情况,我将不胜感激。

【问题讨论】:

  • 您正在尝试释放尚未动态分配的东西。
  • 您是否尝试编译时出现完整警告?并且从函数指针到void* 的转换未加注释?见这里:coliru.stacked-crooked.com/a/8a9598c6388c6b3a
  • 为什么要释放那个可怜的函数指针?
  • 我现在意识到我做错了什么。我错误地认为因为它是一个指针,所以我应该在完成后释放它。感谢您的帮助。
  • @SterlingTolley 不是每个指针都需要释放,只有你动态分配的指针。

标签: c pointers function-pointers


【解决方案1】:

您只需要free 动态分配的内容(例如使用callocmalloc 或该系列中的任何函数)。

您从未分配过内存,因此您不需要释放它。并且将随机指针传递给free 函数会使其行为异常。

【讨论】:

    【解决方案2】:

    找到这个:http://bytes.com/topic/c/answers/504956-do-you-have-delete-function-pointer 用户说:

    您不应该删除函数指针。该函数位于 在您的可执行文件中的某个地方。当你执行你的程序时, 操作系统会将可执行文件加载到内存中。当你的程序分配一个 函数指针的值,它将获得指向的值 函数在可执行文件中的位置。如果你删除它 你的程序,你的编译器很可能会抱怨你 试图删除一个不是指针的对象。

    ...所以即使你的编译器没有给出任何错误,它也很可能在执行过程中失败

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      相关资源
      最近更新 更多