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

时间:2018-09-12 14:34:55

标签: visual-c++ boost-asio

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

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

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

有什么办法可以避免在调试版本中出现此错误?

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

1 个答案:

答案 0 :(得分:0)

这些的常见来源是调试迭代器。他们是您的朋友,因为它们会警告您有关程序中未定义行为的信息。

在此程序中,我看不到任何此类问题:

#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,实际上您是否为Debug配置传递了参数?