c++内存分配器vptr/new实现
c++ memory allocator vptr / new implementation
我为正在处理的项目制作了一个内存池分配器。我的池分配器返回的内存块很好,但我的类继承自另一个类。
MyClass *fx = (MyClass*)pool->allocateEffect(sizeof(MyClass));
*fx = MyClass();
这并没有为我设置vtable。我做了一些搜索,发现新的运算符可以占用大量内存。
MyClass *fx = (MyClass*)pool->allocateEffect(sizeof(MyClass));
fx = new(fx)MyClass();
这将初始化vptr。所以我想知道是否有办法自己分配vptr,或者这完全取决于编译器的突发奇想?
new(fx)MyClass()
这被称为"placement-new",实际上将调用构造函数来实际创建对象。
在您在分配的内存中创建该对象之前,它根本不存在(作为该类型的对象),因此它只是您将其转换为某个对象的原始非类型内存,这会导致未定义的行为。
我建议您将函数设置为类似模板的函数。
template<class T>
T* allocateEffect() { return new (allocate_some_memory(sizeof(T))) T(); }
添加适当的可变模板和转发构造函数参数是留给读者的练习。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- 供应商是否将 new 和 malloc 实现为小型对象分配器
- 如何介入在Eclipse和Linux上实现new()的代码
- 如何重载运算符new来实现类的快速分配器
- 一种按'new'实现分配的方法
- 哪些文件包含malloc()和new()的实现
- 执行operator new的任何实现都返回指向大小为零的数组的保护页的指针
- ' new (std::nothrow) '是如何实现的?
- 当在全局命名空间中覆盖new/delete时,我应该使用std-rtl中的new/delete的默认实现
- new操作符-gnuc++如何实现new和delete
- c++内存分配器vptr/new实现
- 为什么虚拟功能在分配"new"时不能取消实现?
- 为什么C++ 'new'运算符的这种实现有效?
- 我可以在不使用new()的情况下实现工厂模式构造吗?