具有自己内存分配的课程设计
Design of classes with own memory allocation
我在设计将使用自己的内存分配的适当类时遇到了一些麻烦。考虑一下:
class IAbstract { ... };
class CConcrete : public IAbstract { ... };
我想做这样的事情:
IAbstract *ptr = new CConcrete();
delete ptr;
问题是,我希望cconcrete的"新"使用内存分配器。另外,我希望"删除"使用适当的Deallocator。但是,新的和删除是静态函数,因此在上面的示例中删除不会调用cconcrete的删除(如果删除是虚拟的,则应该这样做)。
解决此问题的一种方法是使这样的事情:
class IAbstract {
public:
virtual Delete(void* ptr)=0;
void operator delete(void* ptr) {
((IAbstract*)(ptr))->Delete(ptr);
}
};
和在派生类中删除删除。但是,该解决方案非常丑陋,尤其是将PTR投射到iabtract*。
有什么更好的方法吗?
您是否尝试过?安置新/删除
精确地知道代码出了什么问题是很困难的。我能做的最好的就是向您展示一个工作程序。
考虑此程序:
#include <iostream>
#define X() (std::cout << __PRETTY_FUNCTION__ << "n")
class IAbstract {
public:
virtual ~IAbstract() { X(); }
};
class CConcrete : public IAbstract {
public:
void* operator new(size_t sz) {
X();
return ::operator new(sz); // or however you allocate memory
}
void operator delete(void* p) {
X();
::operator delete(p); // or however you de-allocate memory
}
~CConcrete() { X(); }
};
int main () {
IAbstract *ptr = new CConcrete();
delete ptr;
}
我的计算机上的输出是:
static void* CConcrete::operator new(size_t)
virtual CConcrete::~CConcrete()
virtual IAbstract::~IAbstract()
static void CConcrete::operator delete(void*)
请注意,执行delete ptr
时,delete
正确调用虚拟破坏者和正确的operator delete()
。
注意:由于使用__PRETTY_FUNCTION__
第一个有趣的事情是,您无法施放无效指针来调用任何成员函数。从技术上讲,它是编译的,但是在之后,操作员删除被称为对象(或对象层次结构)被破坏(通过调用destructor(s))。换句话说 - 您正在做的是UB,因为您正在尝试访问被破坏的班级的VT。
另一件事是,只要您的破坏者是虚拟的,可以在类上调用适当的删除操作员。因此,除此之外,无需使用额外的VTAble资源来重新发明自己的机制。我认为以下方法是您要寻找的:
#include <new>
#include <cstdio>
#include <cstdlib>
class Base {
public:
Base() { }
virtual ~Base() { printf("Base::~Base()n"); }
};
class Derived : public Base {
char data[256];
public:
Derived() {}
virtual ~Derived() { printf("Derived::~Derived()n"); }
void *operator new(size_t size)
{
void *p = malloc(size);
printf("Allocated %lu bytes @ %pn", size, p);
return p;
}
void operator delete(void *ptr)
{
printf("Freeing %pn", ptr);
free(ptr);
}
};
int main()
{
Base *b = new Base();
delete b;
b = new Derived();
delete b;
}
,但不要忘记,一旦您删除虚拟驱动器,就不会删除超载的操作员。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 自己的自定义向量类. 内存重新分配
- 使用自己的迭代器分配容器是否安全?
- 使用自己的模板化owner_ptr类来分配多维数组
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- 当一个类在构造函数处动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc
- 如何在 std::map 中添加元素自己进行分配
- c++ 中的每个线程都有自己的内存分配限制吗?
- 如何在c++中对向量进行切片并分配给它自己
- 读取和分析文件,将解析的字符串的每个部分分配给其自己的变量
- C++ stl unordered_map,线程安全,其中每个线程仅访问其自己分配的键,并且可以编辑该值
- 具有自己内存分配的课程设计
- 将对象分配给自己,解决奇怪的问题
- 你能给自己分配一个 std::string 的子字符串吗?
- 将 int 自己的地址分配给其值
- 在xcode(c ++)中由我自己处理内存分配
- 如何使我自己的容器索引和可分配
- 返回的结构调用它自己的析构函数,用于销毁分配的对象