malloc 和 thread 同时, 崩溃
unsigned short int* getPointer()
{
unsigned short int* buf = (unsigned short int*)malloc(4*sizeof(unsigned short int));
unsigned short int* temp = buf;
buf[0]=67;
return temp;
}
void mallocTest()
{
unsigned short int* temp = getPointer();
int i=0;
for(;temp[i]!=0;i++)
{
printf("%c", temp[i]);
}
free(temp);
}
void mallocTreadTest()
{
pthread_t a_thread;
pthread_create(&a_thread, NULL, (void*)mallocTest, NULL);
void* threadresult;
pthread_join(a_thread, &threadresult);
}
为了说明问,代码作了简化.getPointer里调用了malloc,申请了内存.
不用多线程的时候,代码没有问题.
当前代码放在同一个.c文件里运行,也没问题.
奇怪就奇怪在getPointer函数写在另一个.c文件里(对应的.h文件什么的都写好),mallocTest调用getPointer之后 buf的值是(short unsigned int *) 0x7ffff001e5c0
但当getPointer运行出去,也就是temp = getPointer();的时候,
temp的值就成了(short unsigned int *) 0xfffffffff001e5c0 (我是用gdb p打出来的)
调试的时候
(gdb) p rootName[0]
Cannot access memory at address 0xfffffffff001e5c0
如果程序用到rootName,直接就崩溃了.
上网搜了,有老外问malloc 是不是线程安全的,有人说编译加上-pthreads就行了,我不知道他是不是手误说的是-lpthread,但-pthreads这个我加了,提示说没有这个命令.
[解决办法]
跟malloc没什么关系,测试
a.c文件
unsigned short int* getPointer2(unsigned short int* buf)
{
unsigned short int* temp = buf;
temp[0] = 67;
return temp;
}
b.c
void mallocTest()
{
unsigned short int buf[100];
unsigned short int* temp = getPointer2(buf);//getPointer();
int i=0;
for(;temp[i]!=0;i++)
{
printf("%c", temp[i]);
}
//free(temp);
}
照样崩
[解决办法]
进程意外退出会在当前目录下产生‘code’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令
[解决办法]
明显就是未声明函数,默认返回int64导致的