返回的struct调用它自己的析构函数来销毁已分配的对象

时间:2015-05-22 20:52:12

标签: c++ return destructor

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

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

se包含正确的字符串(通过踩到我注意到字符串也被~basic_string()销毁但是当函数返回时它们仍然存在)并且正确(相同)指针值但objet(se。 socket)仍然被破坏。为什么要调用析构函数?为什么我的对象消失了,字符串仍在那里?

1 个答案:

答案 0 :(得分:1)

您正在从函数返回局部变量se,并且当您的代码到达函数的最后一个大括号时,其范围结束。所以它会叫destroctor。

要解决此问题,请在调用函数之前定义变量,并将其作为参数传递给函数。

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