首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++中动态分配全局字符数组中的类的实例?

如何在C++中动态分配全局字符数组中的类的实例?
EN

Stack Overflow用户
提问于 2018-06-01 15:52:48
回答 2查看 352关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
const int size = 1024;
char pool[size];
int nextFree = 0;

class A
{
    ...
}

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

代码语言:javascript
复制
A* a = new A();

然后是要放入全局数组pool的实例。

我正在考虑重载operator new,并在内部使用placement new。如下所示:

代码语言:javascript
复制
class A
{
    ...
    void* operator new(size_t size)
    {
        void * pInt = ::new (&pool[nextFree]) A();
        nextFree += size;
        return pInt;
    }
    ...
}

它一直工作到释放动态分配时,编译器会抛出一个错误:"free():invalid pointer“。我也尝试过重载operator delete,但没有成功。

你知道该怎么做才是正确的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-01 16:31:14

delete new不会分配内存,它只是在已经分配的内存上调用构造函数,所以delete不会产生任何影响。您只需在对象被销毁时使用T::~T()调用析构函数,并在以后释放内存(如果需要)。

票数 0
EN

Stack Overflow用户

发布于 2018-06-01 17:56:42

据我所知,您希望将对象放在池中,但对于最终用户来说,它应该看起来像是将对象放在堆中。在这种情况下,您可以简单地执行以下操作:

代码语言:javascript
复制
#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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50638620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档