- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 C 新手,还没有真正掌握 C 何时决定释放对象以及何时决定保留对象。
heap_t 是指向结构堆的指针。
heap_t create_heap(){
heap_t h_t = (heap_t)malloc(sizeof(heap));
h_t->it = 0;
h_t->len = 10;
h_t->arr = (token_t)calloc(10, sizeof(token));
//call below a couple of times to fill up arr
app_heap(h_t, ENUM, "enum", 1);
return h_t;
}
让 h_t 通过
int app_heap(heap_t h, enum symbol s, char* word, int line){
int it = h->it;
int len = h->len;
if (it + 1 < len ){
token temp;
h->arr[it] = temp;
h->arr[it].sym = s;
h->arr[it].word = word;
h->arr[it].line = line;
h->it = it + 1;
printf(h->arr[it].word);
return 1;
} else {
h->len = len*2;
h->arr = realloc(h->arr, len*2);
return app_heap(h, s, word, line);
}
}
为什么我的 h_t->arr 充满了垃圾,最终出现段错误?我该如何解决?有任何 C 编码技巧/风格可以避免类似的事情吗?
最佳答案
首先,为了回答您有关崩溃的问题,我认为您出现段错误的原因是您未能将 len
乘以 sizeof(token)
调用realloc
。您最终会写入超出已分配 block 末尾的内容,最终触发段错误。
就“决定释放一个对象以及何时 [...] 保留一个对象”而言,C 不会为您做出任何决定:它只是在您通过调用 告诉它时执行此操作免费
,无需询问您任何其他问题。这种“服从”有时最终会让你付出代价,因为你可能会意外地释放你仍然需要的东西。将指针设为 NULL 是一个好主意,可以提高更快地捕获问题的机会(不幸的是,由于共享指针,这不足以完全消除问题)。
free(h->arr);
h -> arr = NULL; // Doing this is a good practice
总而言之,在 C 语言中管理内存是一项繁琐的任务,需要大量的思考和纪律。您需要检查每个分配调用的结果以查看它是否失败,并在失败时执行许多辅助任务。
关于c - 如何防止c中的悬空指针/垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896024/
我遵循了 V. Romeo 关于实体管理的教程(在 GitHub 和 Youtube 上)。 然后我尝试重写类 CEntity、CComponent 和测试 CPosition(主要来自 Romeo
为什么下面的代码中有悬空引用?我认为对 const 的引用总是将临时对象的生命周期延长到它们的范围。 boost::filesystem::recursive_directory_iterator i
我有一个多线程应用程序,将传入消息发布到 rabbitmq 交换。使用 rabbitmq java 客户端,我在应用程序启动时创建了一个 rabbitmq 连接,并在我的所有线程中共享它。每个线程都会
我有一个 Git 存储库,其中有大量提交不在特定分支下,我可以 git show 它们,但是当我尝试列出包含它们的分支时,它没有返回任何内容。 我认为这是悬空提交/树问题(由于 -D 分支),所以我修
我是 Linux 的新手,并且继承了保持我们的单一 Linux 服务器运行的职责。这是我们的SVN服务器,所以比较重要。 原来在我之前维护它的人有一个 cron 任务,当有太多 svnserve 进程
我是一名优秀的程序员,十分优秀!