首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

[]这段程序内存哪儿出有关问题了哈

2012-02-15 
[求助]这段程序内存哪儿出问题了哈错误在HttpSocket.cpp中的Socket函数中,ppegethostbyname( tcp ),就

[求助]这段程序内存哪儿出问题了哈
错误在HttpSocket.cpp中的Socket函数中,ppe=gethostbyname( "tcp "),就是内存错误,但是我不晓得为什么错了....

bool   CHttpSocket::Socket()
{
if(m_bConnected)   return   false;

struct   protoent   *ppe=NULL;
ppe=getprotobyname( "tcp ");

m_s=socket(PF_INET,SOCK_STREAM,ppe-> p_proto);
if(m_s==-1)
{
printf( "socket()   failed!\n ");
return   false;
}

return   true;
}

gdb调试的提示是这样的:
****************************************************
CHttpSocket::Socket   (this=0xbff9a660)   at   HttpSocket.cpp:31
31   if(m_bConnected)   return   false;
(gdb)   n
33   struct   protoent   *ppe=NULL;
(gdb)   n
34   ppe=getprotobyname( "tcp ");
(gdb)   n
***   glibc   detected   ***   free():   invalid   next   size   (normal):   0x09e20cd8   ***

Program   received   signal   SIGABRT,   Aborted.
0x001327a2   in   _dl_sysinfo_int80   ()   from   /lib/ld-linux.so.2
(gdb)   bt
#0   0x001327a2   in   _dl_sysinfo_int80   ()   from   /lib/ld-linux.so.2
#1   0x001727f5   in   raise   ()   from   /lib/tls/libc.so.6
#2   0x00174199   in   abort   ()   from   /lib/tls/libc.so.6
#3   0x001a64ea   in   __libc_message   ()   from   /lib/tls/libc.so.6
#4   0x001acc6f   in   _int_free   ()   from   /lib/tls/libc.so.6
#5   0x001acfea   in   free   ()   from   /lib/tls/libc.so.6
#6   0x0019d516   in   fclose@@GLIBC_2.1   ()   from   /lib/tls/libc.so.6
#7   0x00825305   in   _nss_files_getprotobyname_r   ()   from   /lib/libnss_files.so.2
#8   0x00229332   in   getprotobyname_r@@GLIBC_2.1.2   ()   from   /lib/tls/libc.so.6
#9   0x002291f1   in   getprotobyname   ()   from   /lib/tls/libc.so.6
#10   0x0804961e   in   CHttpSocket::Socket   (this=0xbff9a660)   at   HttpSocket.cpp:34
#11   0x08048ed4   in   Run   (strUrl=0xbffcdb25   "http://hi.baidu.com ")   at   http.cpp:54
#12   0x08048d60   in   main   (args=2,   argv=0xbff9b074)   at   http.cpp:16


代码在这儿     [url=http://bbs.nettf.net/forums/index.php?act=Attach&type=post&id=8533]http.rar[/url]


[解决办法]
pp类型错误.应该为
struct hostent
[解决办法]
ppe
[解决办法]
If no error occurs, getprotobyname returns a pointer to the protoent. Otherwise, it returns a null pointer
so,the program will be dump at m_s=socket(PF_INET,SOCK_STREAM,ppe-> p_proto);
[解决办法]
ppe=getprotobyname( "tcp ");
没有检查ppe的值
[解决办法]
这段代码是没有问题的,一定是其它的部分引起的问题,下面的程序是可以运行的。
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

#include <stdio.h>

#include <iostream>
using namespace std;

class CHttpSocket
{
public:


bool Socket();
CHttpSocket()
{
m_bConnected = false;
m_s = 0;
}
private:
bool m_bConnected;
int m_s;
};

bool CHttpSocket::Socket()
{
if(m_bConnected) return false;

struct protoent *ppe=NULL;
ppe=getprotobyname( "tcp ");
cout < < "ppe = " < < ppe < < endl;
m_s=socket(PF_INET,SOCK_STREAM,ppe-> p_proto);
cout < < "ms_s = " < < m_s < < endl;
if(m_s==-1)
{
printf( "socket() failed!\n ");
return false;
}

return true;
}

int main()
{
CHttpSocket hs;
hs.Socket();
return 0;
}

[解决办法]

(gdb) n
*** glibc detected *** free(): invalid next size (normal): 0x09e20cd8 ***
---------------------------------------------

估计跟内存泄露有很大关系~

建议楼主可以查看下程序是否有内存泄露~

方法~ 运行命令~
$ valgrind --tool=memcheck --leak-check=yes 程序名

可以把结果贴出来~让大家看看~
[解决办法]
有core dump吗? 有的话gdb看一下core.

感觉应该是getprotobyname的问题.
你在这里加个if, 判断一下值.
[解决办法]
楼主的程序是不是多线程的?如果是的话,就是gethostbyname的问题了,它是个不可重入函数,里面使用的是个静态指针来执行由动态分配的一块内存,来保存函数执行的结果,
函数执行先检查释放该块内存,再根据结果大小分配内存,如果多线程调用,free,和malloc就有可能被打断,从而指向一个错误的地址.
[解决办法]

楼主写的是gethostbyname~ 代码是getprotobyname~

[解决办法]
回楼上,应该不是重入的问题:
#8 0x00229332 in getprotobyname_r@@GLIBC_2.1.2 () from /lib/tls/libc.so.6
getprotobyname_r 是可重入版本。

热点排行