C ++ 17多态内存无法正常工作

时间:2018-09-27 11:47:47

标签: c++ memory-management c++17

我试图了解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 :(得分:1)

多态资源分配器分配内存;那就是他们所做的一切。与容器分配器不同,它们不创建对象。这就是为什么他们返回void*的原因。

内存资源并不意味着要自己使用。这就是std::polymorphic_allocator<T>存在的原因。您还可以使用placement-{new和手动析构函数调用来自己创建/销毁对象。

此外,您的memory_resource实现没有任何意义。 do_allocate应该返回分配的内存,而不是内部存储。您的函数通过不返回任何内容(编译器应该警告过)来引发未定义的行为。