返回的结构调用它自己的析构函数,用于销毁分配的对象

Returned struct calls it's own destructor that destroys allocated object

本文关键字:用于 分配 对象 析构函数 结构 调用 它自己 自己的 返回      更新时间:2023-10-16

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 se;时,C++调用se.~SocketException()(它删除se.socket(。我想这是因为se超出了范围,但它也被返回了,所以我不知道这里到底发生了什么。当这一行完成时:

 SocketException se = NewSocketException("accept() in AcceptThread()",server);

se包含正确的字符串(通过进入,我注意到字符串也被~basic_string((破坏,但当函数返回时它们仍然存在(和正确的(相同的(指针值,但objet(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);
 }