当前位置: 技术问答>linux和unix
[求助]这段程序内存哪儿出问题了哈
来源: 互联网 发布时间:2016-02-01
本文导语: 错误在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...
错误在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
代码在这儿 http.rar
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
代码在这儿 http.rar
|
pp类型错误.应该为
struct hostent
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);
so,the program will be dump at m_s=socket(PF_INET,SOCK_STREAM,ppe->p_proto);
|
ppe=getprotobyname("tcp");
没有检查ppe的值
没有检查ppe的值
|
这段代码是没有问题的,一定是其它的部分引起的问题,下面的程序是可以运行的。
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
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