Ресурсы полиморфной памяти C ++ 17 не работают - PullRequest
0 голосов
/ 27 сентября 2018

Я пытался понять c ++ 17 pmr.Итак, я сделал это, и это не работает, как я думал, что может пойти не так?

template <typename T>
class Memory : public std::experimental::pmr::memory_resource {
  public:
    Memory() { this->memory = allocate(sizeof(T), alignof(T)); }
    void *getMemory() { return this->memory; }

    ~Memory() { deallocate(this->memory, sizeof(T), alignof(T)); }

  private:
    void *do_allocate(std::size_t bytes, std::size_t alignment)
    {
        memory = ::operator new(bytes);
    }
    void do_deallocate(void *p, std::size_t bytes, std::size_t alignment)
    {
        ::operator delete(memory);
    }
    bool do_is_equal(
           const std::experimental::pmr::memory_resource& other) const noexcept
    {
    }
    void *memory;
};

что может быть не так с моей реализацией?Это клиент ..

Memory<std::string> mem;
std::string * st = (std::string*)mem.getMemory();
st->assign("Pius");
std::cout << *st;

1 Ответ

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

Полиморфные распределители ресурсов выделяют память ;это все, что они делают.В отличие от распределителей контейнеров, они не создают объектов .Вот почему они возвращают void* с.

Ресурсы памяти не предназначены для использования сами по себе.Вот почему std::polymorphic_allocator<T> существует.Вы также можете создать / уничтожить объект самостоятельно, используя размещение- new и ручные вызовы деструктора.

Кроме того, ваша реализация memory_resource не имеет смысла.do_allocate должен возвращать выделенную память, а не хранить ее внутренне.Ваша функция вызывает неопределенное поведение, ничего не возвращая (о чем ваш компилятор должен был предупредить).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...