免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6021 | 回复: 9
打印 上一主题 下一主题

关于malloc失败的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-14 18:50 |只看该作者 |倒序浏览
我最近在设计短信收发的模块,其中的一个模块是向网关接口发送短信。其中一个线程负责向LIST容器中插入短信(尾部),另一个线程负责从LIST头部取出短信并与服务端进行通讯。不过在插入短信时malloc出错,请各位帮忙分析下,我现在将部分代码贴出。

/*插入LIST的线程*/
void *start_listinsert_thread(void *vag)
{

        SUBMIT *submit;
        int i;
        int j;
        int ret;

        pthread_detach(pthread_self());

        for (j = 0; j < 100000; j++)
        {

                for (i = 0; i < 100; i++)
                {
                        submit = NULL;
                        submit = (SUBMIT *) malloc(sizeof(SUBMIT));
                        if (submit == NULL)
                        {
                                perror("malloc()";
                                exit(1);
                        }

                        memset(submit, 0, sizeof(submit));
                        sprintf(submit->Msg_Content, "短信营业厅测试[%d]", i);
                        memcpy(submit->InData.GWId, "SX05", strlen("SX05");
                        memcpy(submit->FeeType, "1", strlen("1");
                        submit->Fee_terminal_type = 0;
                        htonl(submit->Fee_terminal_type);
                        submit->Msg_Fmt = 15;
                        htonl(submit->Msg_Fmt);

                        memcpy(submit->Fee_terminal_Id, "10086", strlen("10086");
                        memcpy(submit->Service_Id, "HELP", strlen("HELP");
                        memcpy(submit->Src_id, "11111", strlen("11111");
                        memcpy(submit->Dest_terminal_Id, "22222", strlen("22222");
                        submit->head.commandid = APP_SUBMIT;
                        htonl(submit->head.commandid);
                        submit->Msg_Length = strlen(submit->Msg_Content);
                        htonl(submit->Msg_Length);
                        submit->k_total = 1;
                        memcpy(submit->LinkID, "hehhe", strlen("hehhe");

                        interface1(submit);

                }
                msleep(50);
        }
}

int interface1(SUBMIT * submit)
{
        int i;
        unsigned char tmp[MAXSIZE];
        int unicode_len;
        int gb_len;
        int ret;

        unicode_len =wgb2unicode((unsigned char *)submit->Msg_Content, tmp, strlen(submit->Msg_Content));
        if (unicode_len > 140)
        {
                printf("短信长度超过140\n";
                return -1;
        }

        try
        {
                Submit_list.push_back(submit);
        }
        catch(exception & e)
        {
                cout << "exception: " << e.what() << endl;

                msleep(10);
                return -1;
        }
}

/*负责连接并发送短信的线程*/
void *connect_thread(void *arg)
{
        char ip[IP_MAX];
        unsigned int sndport;
        SUBMIT *submit_tmp;
        SUBMIT submit_test;
        int socketid;
        int ret = 0;
        int len;
        int nSendTime = 0;
        int nSendAfterTime = 0;

        int start = time(NULL);
        int end;

        char filename[512];
        memset(filename, 0, sizeof(filename));
        strcpy(filename,"liqiang_log";
        pthread_detach(pthread_self());
        memset(ip, 0, sizeof(ip));

        ret = get_port("ifipcfg", ip, &sndport);
        printf("connect ip[%s] port[%d]\n", ip, sndport);
        if (ret == -1)
        {
                printf("获取IP或端口出错,请查看配置文件\n");
                exit(1);
        }
        else
        {
                printf("获取到ip:%s,端口:%d\n", ip, sndport);
        }

  loop:
        socketid = sndD_bind(ip, sndport);
        if (socketid < 0)
        {
                printf("连接失败\n");

                msleep(500);
                goto loop;
        }

        else
        {
                printf("连接成功\n");
        }

        printf("套接字号:[%d]\n", socketid);

        while (1)
        {

                pthread_mutex_lock(&submit_mutex);

                submit_tmp = NULL;

                submit_tmp = Submit_list.front();        //取出LIST头的数据

                if (submit_tmp != NULL)                        //判断LIST是否为空或到结尾
                {
                        nSendTime = getitime();
                        nSendAfterTime = nSendTime;

                        printf("短信内容:%s########\n", submit_tmp->Msg_Content);

                        /*发送请求给接口机 */
                        ret = Submit(socketid, submit_tmp);
                        if (ret < 0)
                        {
                                printf("发送失败 socket[%d]\n", socketid);
                                pthread_mutex_unlock(&submit_mutex);

                                /*关闭当前socket并重新链接 */
                                close(socketid);

                                goto loop;
                        }
                        else
                        {
                                my_log(filename,submit_tmp->Msg_Content);
                                Submit_list.pop_front();        //从队列中删除
                                free(submit_tmp);
                                pthread_mutex_unlock(&submit_mutex);

                        }
                }
                else
                {
                        pthread_mutex_unlock(&submit_mutex);

                        memset(&submit_test, 0, sizeof(submit_test));
                        end = time(NULL);
                        printf("#######%d########\n", end - start);
                        msleep(1);
                        nSendAfterTime = getitime();
                        if (nSendAfterTime - nSendTime > 50)
                        {
                                /*发送请求给接口机 */

                                submit_test.head.commandid = APP_ACTIVE_TEST;

                                ret = Submit(socketid, &submit_test);
                                if (ret < 0)
                                {
                                        /*关闭当前socket并重新链接 */
                                        close(socketid);
                                        goto loop;
                                }

                                nSendTime = nSendAfterTime;

                                printf("发送心跳检测数据包\n");;
                        }

                        else
                        {
                                msleep(10);
                        }
                }
                msleep(10);
        }
}

论坛徽章:
0
2 [报告]
发表于 2009-07-14 18:54 |只看该作者
提示的错误信息是什么??
就得示说malloc错误??

论坛徽章:
0
3 [报告]
发表于 2009-07-14 18:57 |只看该作者

回复 #2 airhello 的帖子

是的!提示malloc失败!因为我在做压力测试,数据量比较大,大约几万条短信后才有提示!麻烦你看下我的free函数是否用的得当?谢谢

论坛徽章:
0
4 [报告]
发表于 2009-07-14 20:20 |只看该作者


复制代码

发正确代码

论坛徽章:
0
5 [报告]
发表于 2009-07-15 05:29 |只看该作者

回复 #3 baiseqiji 的帖子

直觉上是free没到位。

看下你的if语句,如果分支语句走其他的分支,你是否都做到了malloc的都free了。

论坛徽章:
0
6 [报告]
发表于 2009-07-15 08:48 |只看该作者

回复 #5 samon_fu 的帖子

现在压根就没走else语句,因为容器中始终有短信,当容器不为空的时候,就不能在继续申请内存了!请各位帮我看下,我一直都没找到错误,很郁闷。

论坛徽章:
0
7 [报告]
发表于 2009-07-15 09:14 |只看该作者

  1. if (unicode_len > 140)
  2.         {
  3.                 printf("短信长度超过140\n";
  4.                 return -1;
  5.         }

  6.         try
  7.         {
  8.                 Submit_list.push_back(submit);
  9.         }
  10.         catch(exception & e)
  11.         {
  12.                 cout << "exception: " << e.what() << endl;

  13.                 msleep(10);
  14.                 return -1;
  15.         }
复制代码

这里两个return -1前都要free把

  1. ret = Submit(socketid, submit_tmp);
  2.                         if (ret < 0)
  3.                         {
  4.                                 printf("发送失败 socket[%d]\n", socketid);
  5.                                 pthread_mutex_unlock(&submit_mutex);

  6.                                 /*关闭当前socket并重新链接 */
  7.                                 close(socketid);

  8.                                 goto loop;
  9.                         }

复制代码

这里ret<0的时候 你是怎么处理的? 是重新处理还是丢弃的,丢弃的话就又要free了

程序没细看...

论坛徽章:
0
8 [报告]
发表于 2009-07-15 09:17 |只看该作者

回复 #7 ubuntuer 的帖子

恩,我一直就觉得return比goto可怕的多,最少可怕10000倍。

论坛徽章:
0
9 [报告]
发表于 2009-07-15 09:17 |只看该作者

回复 #7 ubuntuer 的帖子

谢谢你的答复,ret < 0的话我不做处理,做重发处理,下次依然从LIST头去取短信,确保短信不丢失

论坛徽章:
0
10 [报告]
发表于 2009-07-15 09:21 |只看该作者

回复 #7 ubuntuer 的帖子

你说当unicode_len > 140的时候应该是加FREE,不过我的短信内容没有超过140字节,所以问题应该不在这!我不知道malloc在多线程时会出现什么,是不是多线程的原因呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP