猿问

到底是什么情况?为什么我的对象老是自动销毁!?

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;}

慕桂英4014372
浏览 70回答 1
1回答

翻阅古今

你程序的问题是在无参构造函数里调用了有参构造函数。且调用的方法不对。你那种直接调用的方法是生成一个临时的对象,然后初始化(不初始化你的对象)。而且编译程序会在调用构造函数的后面紧接着替你调用析构函数,释放这临时对象。建议你可以把有参构造函数里做的事情打包为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;}
随时随地看视频慕课网APP
我要回答