为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕桂英4014372 2023-02-17 22:18:02
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;
}

查看完整回答
反对 回复 2023-02-20
  • 1 回答
  • 0 关注
  • 50 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信