我有这样的代码:
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():invalid pointer“。我也尝试过重载operator delete
,但没有成功。
你知道该怎么做才是正确的吗?
发布于 2018-06-01 16:31:14
delete new不会分配内存,它只是在已经分配的内存上调用构造函数,所以delete不会产生任何影响。您只需在对象被销毁时使用T::~T()
调用析构函数,并在以后释放内存(如果需要)。
发布于 2018-06-01 17:56:42
据我所知,您希望将对象放在池中,但对于最终用户来说,它应该看起来像是将对象放在堆中。在这种情况下,您可以简单地执行以下操作:
#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://stackoverflow.com/questions/50638620
复制相似问题