Сохранение строки как char[] с размещением new и возвращением

Я хочу написать класс, который содержит информацию о строке в памяти и которая может вернуть ее мне. Итак, я начал с Союза, который содержит размер строки. (почему объединение здесь не имеет значения, но оно должно быть объединением для других типов в дальнейшем). Конструктор получает переданную строку и должен поместить строку как c_str в конец объекта, который я помещаю с размещением new. Класс выглядит так:

class PrimitivTyp
{
public:
    explicit PrimitivTyp(const std::string &s);
    std::shared_ptr<std::string> getString() const;
private:
    union
    {
        long long m_long; //use long long for string size
        double m_double;
    } m_data;
    ptrdiff_t m_next;
};

И impl Ctor и функции get выглядит так, что, я думаю, не работает должным образом.

PrimitivTyp::PrimitivTyp(const std::string& s)
{
    m_data.m_long = s.size();
    m_next = reinterpret_cast<ptrdiff_t>(nullptr);
    //calc the start ptr
    auto start = reinterpret_cast<ptrdiff_t*>(this + sizeof(PrimitivTyp));
    memcpy(start, s.c_str(), s.size()); //cpy the string
}

std::shared_ptr<std::string> PrimitivTyp::getString() const
{
    auto string = std::make_shared<std::string>();
    //get the char array
    auto start = reinterpret_cast<ptrdiff_t>(this + sizeof(PrimitivTyp)); //get the start point
    auto size = m_data.m_long; //get the size
    string->append(start, size);//appand it
    return string;//return the shared_ptr as copy
}

Использование должно быть примерно таким:

int main(int argc, char* argv[])
{
    //checking type
    char buffer[100];
    PrimitivTyp* typ = new(&buffer[0]) PrimitivTyp("Testing a Type");
    LOG_INFO << *typ->getString();
}

Это дает сбой, и я не нахожу ошибки с отладчиком. Я думаю, что это что-то с расчетом позиции this,

1 ответ

Решение

this + sizeof(PrimitivTyp) это не то, что вы думаете, вы хотите this + 1 или же reinterpret_cast<uint8_t*>(this) + sizeof(PrimitivTyp),

Арифметика указателей в C и C++ учитывает тип указателя.

так с T* t;, (t + 1) является &t[1] (при условии отсутствия перегрузки operator &) или же reinterpret_cast<T*>(reinterpret_cast<uint8_t>(t) + sizeof(T)),

Другие вопросы по тегам