Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost测试和异步IO:地址内存访问冲突:错误地址无映射_C++_Linux_Boost Asio_Boost Test - Fatal编程技术网

C++ boost测试和异步IO:地址内存访问冲突:错误地址无映射

C++ boost测试和异步IO:地址内存访问冲突:错误地址无映射,c++,linux,boost-asio,boost-test,C++,Linux,Boost Asio,Boost Test,我正在尝试为tcpip的异步i/O设置一个boost测试 发送tcp消息的我的函数: int TcpClient::sendMsgToServer(string msg) { if (isConnected == true) { Logger::debug("Asynch send request for msg: " + msg, __LINE__, __FILE__); sendSequence++;

我正在尝试为tcpip的异步i/O设置一个boost测试

发送tcp消息的我的函数:

    int TcpClient::sendMsgToServer(string msg) {
    if (isConnected == true) {
        Logger::debug("Asynch send request for msg: " + msg, __LINE__,
                __FILE__);
        sendSequence++;
        msg.append("\r\n");
        int length = msg.length() + 2; //+2 is for \r\n
        char* buffer = (char*) msg.c_str();
        Logger::debug(buffer, __LINE__, __FILE__);
        m_Socket.async_send(boost::asio::buffer(buffer, length),
                boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
                        this, boost::asio::placeholders::error,
                        boost::asio::placeholders::bytes_transferred));
        std::string sentMsg = "Sent Msg: " + msg;
        Logger::debug(sentMsg, __LINE__, __FILE__);


        return 0;
    } else {
        return -1;
    }

}

    void TcpClient::sendMsgToServerErrorHandler(
            const boost::system::error_code& error, std::size_t bytes_transferred) {
        Logger::debug("Sending complete: ", __LINE__, __FILE__);
        sendResponseSequence++;
        int i = error.value();
        std::stringstream ss;
        ss.clear();
        ss << i;
        Logger::debug("RESULTCODE: " + ss.str(), __LINE__, __FILE__);
        if (i == 0) {
            Logger::debug("RESULT: " + error.message(), __LINE__, __FILE__);

        } else {
            Logger::crit(error.message(), __LINE__, __FILE__);
            m_Socket.close();
            isConnected = false;
            connectionStateChanged(isConnected);
        }

    }
在测试这些异步函数时,有什么我应该注意的吗

我的构建信息是:

Platform: linux
Compiler: GNU C++ version 4.7.2
STL     : GNU libstdc++ version 20120920
Boost   : 1.49.0

编辑:

我也尝试过以以下方式修改它..但仍然得到相同的错误:

int TcpClient::sendMsgToServer(string msg) {
    if (isConnected == true) {
        Logger::debug("Asynch send request for msg: " + msg, __LINE__,
                __FILE__);
        sendSequence++;
        msg.append("\r\n");
    char *buffer = new char[msg.size() + 1];
    buffer[msg.size()] = 0;
    memcpy(buffer, msg.c_str(), msg.size());
    Logger::debug(buffer, __LINE__, __FILE__);

    m_Socket.async_send(boost::asio::buffer(buffer, (msg.size() + 1)),
            boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
                    this, boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));
        std::string sentMsg = "Sent Msg: " + msg;
        Logger::debug(sentMsg, __LINE__, __FILE__);


        return 0;
    } else {
        return -1;
    }

}

m\u Socket.async\u send(boost::asio::buffer(buffer,length)
--但是
msg
对象是本地的,它的
c\u str()
结果在
msg
超出范围后无效!因此您实际上向异步操作传递了一个临时缓冲区。缓冲区不会超过此操作,因此segfault是不可避免的。

CommunicationRefixture的默认构造函数是否确保其
c
成员指向有效对象?是的。事实上,我应该提到,如果我删除以下部分:m_Socket.async_send(boost::asio::buffer(buffer,length),boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,this,boost::asio::placeholders::error,boost::asio::placeholders::bytes\u transfer));它运行没有问题。根据你的建议编辑了它。不确定我做得是否正确。但仍然得到相同的结果error@Shrouk哈桑·汗:现在看来是对的。如果你仍然遇到车祸,可能是另一次(但类似)放置。此外,检查
TcpClient
实例是否比异步操作更有效。事实上,您是正确的。错误来自于在函数(此处未提及)中初始化boost::线程,该函数的有效期不足以传递给sendMsgToServer。
Platform: linux
Compiler: GNU C++ version 4.7.2
STL     : GNU libstdc++ version 20120920
Boost   : 1.49.0
int TcpClient::sendMsgToServer(string msg) {
    if (isConnected == true) {
        Logger::debug("Asynch send request for msg: " + msg, __LINE__,
                __FILE__);
        sendSequence++;
        msg.append("\r\n");
    char *buffer = new char[msg.size() + 1];
    buffer[msg.size()] = 0;
    memcpy(buffer, msg.c_str(), msg.size());
    Logger::debug(buffer, __LINE__, __FILE__);

    m_Socket.async_send(boost::asio::buffer(buffer, (msg.size() + 1)),
            boost::bind(&fingigcc::TcpClient::sendMsgToServerErrorHandler,
                    this, boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));
        std::string sentMsg = "Sent Msg: " + msg;
        Logger::debug(sentMsg, __LINE__, __FILE__);


        return 0;
    } else {
        return -1;
    }

}