- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在调试一段遗留代码,它在带有 linux 的 XScale (arm v5te) 系统上运行,可重现崩溃。
我已经使用 gdb 进行了调试并将 MALLOC_CHECK_ 设置为 1。代码很多,所以只是一些片段:
我们有这样的结构:
typedef struct {
...clipped..
char **data_column_list;
/** data column count */
int data_column_cnt;
...clipped
} csv_t;
我们在函数中初始化列,将它们放在变量“列”中
/* Allocating memory for pointer to every register id */
columns = (char **) malloc(column_cnt * sizeof(char *));
column_cnt = 0;
/* loop over all sensors */
for(i=0; i<cfg.sen_cnt; i++) {
/* loop over all registers */
for(j=0; j<cfg.sen_list[i]->data_cnt; j++) {
/* Storing all the pointers to id */
columns[column_cnt++] = cfg.sen_list[i]->data_list[j]->id;
}
}
在另一个函数中,发生的是这样的:
/* free the previous list */
csv_free(lc_csv);
lc_csv->data_column_list = columns;
lc_csv->data_column_cnt = column_cnt;
csv_free 存在:
void csv_free(csv_t *csv) {
if(csv->data_column_cnt > 0)
free(csv->data_column_list);
csv->data_column_cnt = 0;
}
现在,还有另一个函数,构建包含这些 ID 的整个“cfg”/config 结构。上面的代码:cfg.sen_list[i]->data_list[j]->id;其中 cfg 是一个结构,sen_list 是一个指向结构的指针数组,data_list 是一个指向其他结构的指针数组,其中包含一个字符串“id”。
当程序收到信号 SIGUSR1 时,配置正在更新。所有这些 data_list 和 sen_list 结构都被释放,然后生成新的结构。然后使用第一个函数,生成新的 id 列并将其放入 csv 结构中,但之前已释放旧列表。
这就是它崩溃的地方。在 csv_free 中。
*** glibc detected *** /root/elv: free(): invalid pointer: 0x0001ae88 ***
我觉得应该是这样的。你有一个指针数组。当你释放指针时,你必须释放指针,指向一组指针(数组)。或者用代码来说,上面的情况应该类比为:
char **ar = malloc(n * sizeof(char *));
char *xn = malloc(10 * sizeof(char)); // Do for 0 to n strings
...
ar[n] = xn; // Do for 0 to n strings
...do stuff...
free(xn); // Do for 0 to n strings
free(ar);
当包含 id 字符串的结构被释放时,我的指针数组仍然带有(无效的)指针,而不是空指针:
(gdb) p csv
$40 = {sysid = 222, ip = '\0' <repeats 49 times>,
module = "elv_v2", '\0' <repeats 14 times>, format_type = 1, msg_id = 0,
data_column_list = 0x1ae88, data_column_cnt = 10, pub_int = 30,
line_cnt = 0, pub_seq = -1, format = 0x18260}
(gdb) p csv.data_column_list[0]
$41 = 0x1b378 "0"
但是我收到了上面的错误消息(或者没有 MALLOC_CHECK_ 的 SIGABRT)。我完全不明白这一点。我必须释放这个指针数组,否则它会成为内存泄漏。在此之前,我找不到其他免费电话。我不知道为什么 csv.data_column_list 被认为是无效指针。不幸的是,Valgrind 在 arm v5te 上不可用:(
已经调试了好几个小时,很乐意提供任何帮助。非常感谢,干杯,本
更新:
我想知道它是否与某些“范围”问题有关。在另一个应用程序中有几乎相同的代码,它可以工作。崩溃的函数“csv_free”被两个程序使用(静态链接)。唯一的区别是,包含要释放的指针的结构在工作程序中正常声明和定义,并声明为 external
并在 main.c 之外的另一个文件中定义在 main.c 中手动调用“free”有效,而调用“csv_free”会崩溃。给我谜语这个...
最佳答案
当我遇到 free() 错误时,10 次中有 9 次问题实际上是在分配或初始化时开始的,所以让我们验证一下:
在 调用 csv_free
之前,您实际上在哪里将 columns
分配给 csv.data_columns_list
?如果它在您 free() 时未初始化,则可以解释错误。
在第二个代码块中,如果初始的 column_cnt(我猜是设置其他地方?)小于你将在外面写的循环之后的 column_cnt大批。人们希望 MALLOC_CHECK_ 能够捕捉到这一点,但是如果您断言为如下:
/* Allocating memory for pointer to every register id */
columns = (char **) malloc(column_cnt * sizeof(char *));
int old_column_cnt = column_cnt;
column_cnt = 0;
/* loop over all sensors */
for(i=0; i<cfg.sen_cnt; i++) {
/* loop over all registers */
for(j=0; j<cfg.sen_list[i]->data_cnt; j++) {
/* Storing all the pointers to id */
columns[column_cnt++] = cfg.sen_list[i]->data_list[j]->id;
}
}
assert(old_column_cnt >= column_cnt);
关于c - free() 无效指针 - 释放指针数组失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9739964/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
指针, C语言的精髓 莫队先咕几天, 容我先讲完树剖 (因为后面树上的东西好多都要用树剖求 LCA). 什么是指针 保存变量地址的变量叫做指针. 这是大概的定义, 但是Defad认为
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我是一名优秀的程序员,十分优秀!