亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

到底是什么情況?為什么我的對象老是自動銷毀?。?/h1>

到底是什么情況?為什么我的對象老是自動銷毀???

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 關注
  • 89 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號