LINUX.ORG.RU

Сокеты: segfault при копировании char* в std::string

 , ,


0

1

Доброго времени суток,

Есть такой код:

std::string TcpSocket::read() const {
    std::string result;

    const size_t bufSize = 200;
#if USE_HEAP
    char *buffer = new char[bufSize];
#else
    char buffer[200];
#endif

    ssize_t size = recv(m_fd, &buffer, bufSize, 0);

    if (size > 0) {
        cerr << "## DEBUG: TcpSocket: read " << size << " bytes from "
             << "<" << host() << ":" << port() << ">" << endl;
        result.assign(buffer, 0, size);
    } else if (size == -1) {
        if (errno != EAGAIN && errno != EWOULDBLOCK) {
            addError(errno, "cannot read from TcpSocket");
        }
    }

#if USE_HEAP
    delete [] buffer;
#endif

    return result;
}

... и он (почти) прекрасно работает. Но как только

#define USE_HEAP 1
Код падает на ошибке сегментации на строке
result.assign(buffer, 0, size);

Подскажите пожалуйста, что это может быть?

P.S. Попутно вопрос: надо ли в recv передавать MSG_DONTWAIT если сокет создавался O_NONBLOCK?

★★★★★

Последнее исправление: KennyMinigun (всего исправлений: 3)

Когда buffer является указателем (т.е. при USE_HEAP), &buffer передаёт указатель на этот указатель, и recv портит значение указателя.

Пусть будет просто buffer, например.

LeninGad
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.