返回的结构调用它自己的析构函数来销毁分配的对象
Returned struct calls it's own destructor that destroys allocated object
NewSocketException():
SocketException NewSocketException(string callstack,Socket* socket)
{
SocketException se;
se.callStack = callstack;
se.message = GetLastWinsockErrorMessage(&se.code);
if (socket != nullptr)
se.socket = new Socket(*socket);
return se;
}
NewSocketException()
应该为我制作 SocketException
结构并 return 它。当执行 return se;
时,C++ 调用 se.~SocketException()
(它删除 se.socket
)。我想那是因为 se
超出了范围,但它也被 returned 所以我不知道这里到底发生了什么。完成此行后:
SocketException se = NewSocketException("accept() in AcceptThread()",server);
se
包含正确的字符串(通过进入我注意到字符串也被 ~basic_string() 破坏但是当函数 returns 时它们仍然存在)并且正确(相同)指针值但对象 (se.socket) 仍被销毁。为什么调用析构函数?为什么我的对象不见了而字符串还在?
您正在从函数返回一个局部变量 se
,当您的代码到达函数的最后一个大括号时,它的范围结束。所以它会调用析构函数。
要解决此问题,请在调用函数之前定义一个变量并将其作为参数传递给您的函数。
SocketException se;
void NewSocketException(string callstack,Socket* socket, SocketException &se)
{
se.callStack = callstack;
se.message = GetLastWinsockErrorMessage(&se.code);
if (socket != nullptr)
se.socket = new Socket(*socket);
}
NewSocketException():
SocketException NewSocketException(string callstack,Socket* socket)
{
SocketException se;
se.callStack = callstack;
se.message = GetLastWinsockErrorMessage(&se.code);
if (socket != nullptr)
se.socket = new Socket(*socket);
return se;
}
NewSocketException()
应该为我制作 SocketException
结构并 return 它。当执行 return se;
时,C++ 调用 se.~SocketException()
(它删除 se.socket
)。我想那是因为 se
超出了范围,但它也被 returned 所以我不知道这里到底发生了什么。完成此行后:
SocketException se = NewSocketException("accept() in AcceptThread()",server);
se
包含正确的字符串(通过进入我注意到字符串也被 ~basic_string() 破坏但是当函数 returns 时它们仍然存在)并且正确(相同)指针值但对象 (se.socket) 仍被销毁。为什么调用析构函数?为什么我的对象不见了而字符串还在?
您正在从函数返回一个局部变量 se
,当您的代码到达函数的最后一个大括号时,它的范围结束。所以它会调用析构函数。
要解决此问题,请在调用函数之前定义一个变量并将其作为参数传递给您的函数。
SocketException se;
void NewSocketException(string callstack,Socket* socket, SocketException &se)
{
se.callStack = callstack;
se.message = GetLastWinsockErrorMessage(&se.code);
if (socket != nullptr)
se.socket = new Socket(*socket);
}