Ошибка отладки ASIO в сборке отладки MSVC - нет ошибки в сборке выпуска - PullRequest
0 голосов
/ 12 сентября 2018

Простой tcp-клиент, использующий ASIO, вызывает abort () для построения отладки.То же приложение в Release build работает без выдачи ошибки.Компилятор - 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();
  }
}

1 Ответ

0 голосов
/ 12 сентября 2018

Общий источник - итераторы отладки. Они ваши друзья, потому что они предупреждают вас о неопределенном поведении в вашей программе.

В этой программе я не вижу таких проблем:

#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, фактически ли вы передавали аргументы для конфигурации отладки?

...