如何在 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;
}
我有这个代码:
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;
}