如何在 C++ 中的全局 char 数组中动态分配 class 的实例?

How to dynamically allocate an instance of a class in a global char array in C++?

我有这个代码:

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

class A
{
    ...
}

我必须扩展 class A 的功能,这样当客户端调用这个 class 的动态分配时:

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(): invalid pointer"。我也尝试过重载 operator delete 但没有成功。

有什么正确的方法吗?

placement new 不分配内存,它只是在已分配的内存上调用构造函数,因此 delete 没有意义。您只是假设在对象被销毁时使用 T::~T() 调用析构函数并稍后释放内存(如果需要)。

据我了解,您想将对象放入池中,但对于最终用户而言,他们应该将对象放置在堆中。在这种情况下,您可以简单地这样做:

#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