Как динамически выделить экземпляр класса в глобальном массиве символов в C ++? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть этот код:

const int size = 1024;
char pool[size];
int nextFree = 0;

class A
{
    ...
}

Я должен расширить функциональные возможности class A таким образом, чтобы при вызове клиентом динамического выделения этого класса:

A* a = new A();

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

Я думаю о перегрузке operator new и использовании placement new внутри.Примерно так:

class A
{
    ...
    void* operator new(size_t size)
    {
        void * pInt = ::new (&pool[nextFree]) A();
        nextFree += size;
        return pInt;
    }
    ...
}

и это работает, пока не дойдет до освобождения динамического выделения, когда компилятор выдает ошибку: «free (): неверный указатель».Я тоже пытался перегрузить operator delete, но безуспешно.

Есть идеи, как это сделать правильно?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Как я понял, вы хотите поместить свой объект в пул, но для конечного пользователя это должно выглядеть так, как будто они помещают объект в кучу.В этом случае вы можете просто сделать это:

#include <iostream>

const int size = 1024;
char pool[size];
int nextFree = 0;

class A
{
public:
    int i = 123; // some data

    A() { std::cout << "constructor\n"; }
    ~A() { std::cout << "destructor\n"; }

    static void* operator new(std::size_t size) noexcept
    {
        void *ptr = &pool[nextFree];
        nextFree += size;
        return ptr;
    }

    static void operator delete(void* ptr, std::size_t size) noexcept
    {
        //memset(ptr, 0, size); for example
    }
};

int main()
{
    A* a = new A();
    std::cout << std::boolalpha << (a == reinterpret_cast<A*>(&pool[0])) << std::endl;
    delete a;
}

https://ideone.com/zMW86t

0 голосов
/ 01 июня 2018

Размещение new не выделяет память, оно просто вызывает конструктор на уже выделенной памяти, поэтому удаление не имеет смысла.вы просто должны вызывать деструктор, используя T::~T(), когда объект разрушается, и освобождать память (если необходимо) позже.

...