gpt4 book ai didi

C++:不理解对象销毁规则

转载 作者:行者123 更新时间:2023-11-30 02:45:35 26 4
gpt4 key购买 nike

以下 C++ 代码片段使用了 Microsoft 的 C++ Rest SDK。我不明白为什么第一个片段有效而其他片段无效。我假设差异是由于对象破坏和范围规则造成的。我正在寻找关于为什么第一个片段有效而其他片段卡在 close() 上的解释。另外,SDK 可以做什么来消除 future 的错误。一些非常聪明的人查看了该片段,但从未发现问题所在。

第一个代码片段。该片段有效并完整显示。后续代码片段替换其中标记的代码。请关注差异而不是其他干扰。通过在浏览器中发出单个 GET 请求并单步执行代码来测试代码。在所有情况下,request.reply() 只执行一次。

    boost::lockfree::spsc_queue<web::http::http_request, boost::lockfree::capacity<1024>> queue;
web::http::experimental::listener::http_listener listener(U("http://localhost:3901"));
listener.support([&](web::http::http_request request)
{
queue.push(request);
});
listener.open().wait();
std::cout << "listening ... hit enter to initiate shutdown." << std::endl;
std::getchar();
// BEGIN CODE IN QUESTION
while (!queue.empty())
{
web::http::http_request request;
if (queue.pop(request))
request.reply(web::http::status_codes::ServiceUnavailable, U("Service Unavailable")).wait();
}
// END CODE IN QUESTION
listener.close().wait();

第二个代码片段。在 close() 上挂起。

    // hangs on close().wait()
web::http::http_request request;
while (queue.try_pop(request))
{
request.reply(web::http::status_codes::ServiceUnavailable, U("Service Unavailable")).wait();
}

第三个代码片段。在 close() 上挂起。

    // hangs on close().wait(). Outer braces make no difference.
{
web::http::http_request request;
while (queue.try_pop(request))
{
request.reply(web::http::status_codes::ServiceUnavailable, U("Service Unavailable")).wait();
request.~http_request();
}
}

第四个代码片段。卡在 close() 上。外括号没有区别。

    // hangs on close().wait()
{
web::http::http_request request;
while (queue.try_pop(request))
{
request.reply(web::http::status_codes::ServiceUnavailable, U("Service Unavailable")).wait();
request.~http_request();
}
request.~http_request();
}

更新:支持 Matt McNabb 的解释,如果我只发出一个 GET,则以下代码有效。我只是删除了处理单个 GET 的循环。需要显式析构函数调用以避免挂起,但这是不正确的做法。

    web::http::http_request request;
requests.pop(request);
request.reply(web::http::status_codes::ServiceUnavailable, U("Service Unavailable")).wait();
request.~http_request();

更新:循环后的显式析构函数调用使程序适用于单个 GET。但是,两个或多个 GET 会引发异常。我不确定为什么。

    web::http::http_request request;
while (queue.try_pop(request))
{
request.reply(web::http::status_codes::ServiceUnavailable, U("Service Unavailable")).wait();
}
request.~http_request();

最佳答案

这些示例中的每一个都存在相同的问题:请求对象的构造和破坏不匹配。我很少看到如此聪明的人做错了。

简单的解决方案是:

  1. 在 block 中声明对象,此时它将被分配。
  2. 不要显式调用析构函数(这很少是个好主意)。
  3. 该对象将在 block 退出时销毁。

看来需要在调用close()之前销毁,这也是合理的。


我的意思是第二个例子是唯一一个对象根本没有被破坏的例子,它也失败了。我认为这是由于某些其他原因在此代码中不可见。

关于C++:不理解对象销毁规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341792/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com