MSVC 调试版本中的 ASIO 调试错误 - 发布版本中没有错误



使用 ASIO 的简单 tcp 客户端会导致为调试构建调用 abort((。发布版本中的同一应用程序可以正常工作,而不会引发错误。编译器是Visual Studio 2017。

将调试器附加到应用程序不会提供任何其他信息。

下面显示了一个演示示例,该示例将端口作为连接到服务器并立即断开连接的命令行参数。

有什么方法可以避免调试版本中的此错误吗?

#include <memory>
#include <string>
#include <iostream>
#include "asio.hpp"
using asio::ip::tcp;
class Client {
std::unique_ptr<asio::io_service> io_service_ = nullptr;
std::unique_ptr<tcp::socket> sock_ = nullptr;
public:
Client() {
io_service_ = std::make_unique<asio::io_service>();
sock_ = std::make_unique<tcp::socket>(*io_service_);
}
void connect(std::string hostname, unsigned int port) {
auto resolver = tcp::resolver(*io_service_);
auto query = tcp::resolver::query(hostname, std::to_string(port));
auto endpoint_iter = resolver.resolve(query);
asio::connect(*sock_, endpoint_iter);
}
};
int main(int argc, char* argv[]) {
try {
auto port = std::stoi(argv[1]);
Client client;
client.connect("localhost", port);
} catch (std::exception& e) {
std::cout << "n" << e.what();
}
}

这些的常见来源是调试迭代器。他们是你的朋友,因为他们警告你程序中的未定义行为。

在这个程序中,我没有看到这样的问题:

#include <iostream>
#include <memory>
#include <string>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;
class Client {
std::unique_ptr<boost::asio::io_service> io_service_ = nullptr;
std::unique_ptr<tcp::socket> sock_ = nullptr;
public:
Client() {
io_service_ = std::make_unique<boost::asio::io_service>();
sock_ = std::make_unique<tcp::socket>(*io_service_);
}
void connect(std::string hostname, unsigned int port) {
auto resolver = tcp::resolver(*io_service_);
auto query = tcp::resolver::query(hostname, std::to_string(port));
auto endpoint_iter = resolver.resolve(query);
boost::asio::connect(*sock_, endpoint_iter);
}
};
int main() {
try {
Client client;
client.connect("localhost", 6767);
} catch (std::exception &e) {
std::cout << "n" << e.what();
}
}

主要区别在于我没有使用argv[1]。既然你没有检查argc,你实际上是否传递了调试配置的参数?

最新更新