memcpy для массива уровня класса в конструкторе копирования приводит к segfault - PullRequest
2 голосов
/ 26 февраля 2011

Существует класс шаблона для последовательностей в 4-буквенном алфавите (=> 2 бита на букву):

template <size_t _size>
class Seq {
private:
    const static size_t _byteslen = (_size / 4) + (_size % 4 != 0);
    char _bytes[_byteslen];
public:
    Seq() {};
    Seq(const char* s);
    Seq(const Seq<_size> &seq);
    ...
    std::string str() const;
    ...
}

Если конструктор копирования реализован как глупый из строки, то все работает нормально.

Seq(const Seq<_size> &seq) {
    Seq(seq.str().c_str());
}

В противном случае, если конструктор копирования использует memcpy, например:

Seq(const Seq<_size> &seq) {
    memcpy(_bytes, seq._bytes, _byteslen);
}

Программа получает ошибку segfault спустя несколько секунд (выполняет операции + = или [] с совершенно другим std ::строка).В чем может быть проблема с такой memcpy?Спасибо.

PS memmove не помогает.

Ответы [ 2 ]

5 голосов
/ 26 февраля 2011

"Если конструктор копирования реализован как глупый из-за-строки, то все работает нормально."Потому что этот конструктор вообще не инициализирует _bytes[].(Вместо этого создается другой временный объект Seq, который не используется и немедленно уничтожается.)

0 голосов
/ 26 февраля 2011

Просто предположение: ваша функция str () возвращает _bytes в виде строки, пытаясь построить ее из буфера, который не завершен нулем.

...