SocketAction* UDPSocket=new SocketAction();我用gdb跟踪这一句,刚刚执行完构造函数的最后一句就直接进入析构函数了。然后我用gdb 命令p *UDPScoket之后就都成空的了。 我是用new开辟的空间,我的这个类里面构造函数里面调用了这个类的静态成员函数。是不是这个原因? 我的构造函数是这样的。SocketAction::SocketAction() { // TODO Auto-generated constructor stub int fd; SocketAction::CreatSocket(fd); SocketAction(fd, SocketAction::GetAClientAddr("127.0.0.1"));}SocketAction::SocketAction(int fd, struct sockaddr_in *Client) { this->c_fd = fd; this->Port = 8888; this->InitAddr(this->Server); this->Client = *((sockaddr*) Client); this->Action_bind(); this->recv_len = 0;}两个静态成员函数是这样的。//第一个静态成员函数bool SocketAction::CreatSocket(int &fd) { fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd == -1) { perror("had some err for create socket"); exit(1); } return true;}//分割行struct sockaddr_in* SocketAction::GetAClientAddr(const char* IPNum) { struct sockaddr_in* TempAddr = new sockaddr_in; TempAddr->sin_family = AF_INET; TempAddr->sin_port = 8888; TempAddr->sin_addr.s_addr = inet_addr(IPNum); return TempAddr;}
1 回答
翻阅古今
TA贡献1780条经验 获得超5个赞
你程序的问题是在无参构造函数里调用了有参构造函数。且调用的方法不对。
你那种直接调用的方法是生成一个临时的对象,然后初始化(不初始化你的对象)。而且
编译程序会在调用构造函数的后面紧接着替你调用析构函数,释放这临时对象。
建议你可以把有参构造函数里做的事情打包为init(。。。)方法,所有构造函数都调用init就行了。
我特地去研究了一下,如果你非要调用构造函数的话,改成:
this->SocketAction::SocketAction(fd, SocketAction::GetAClientAddr("127.0.0.1"));
应该是可以的。
看看下面有趣的例子:(能正确运行完)
#include"stdio.h"
#include"stdlib.h"
class A
{
public:
int a,b;
A(int i, int k){ a=i; b=k; }
};
void main()
{
A* pA=(A*)malloc(sizeof(A));
pA->A::A(1,2);
printf("A.a=%d A.b=%d\n",pA->a,pA->b);
delete pA;
}
- 1 回答
- 0 关注
- 69 浏览
添加回答
举报
0/150
提交
取消