相关疑难解决方法(0)

何时使用虚拟析构函数?

我对大多数OO理论有了深刻的理解,但让我困惑的一件事是虚拟析构函数.

我认为无论什么以及链中的每个对象,析构函数总是会被调用.

你什么时候打算让它们成为虚拟的?为什么?

c++ polymorphism shared-ptr virtual-destructor

1420
推荐指数
13
解决办法
66万
查看次数

C++ delete运算符如何找到多态对象的内存位置?

我想知道delete操作符如何在给出与对象的真实内存位置不同的基类指针时计算出需要释放的内存位置.

我想在我自己的自定义分配器/解除分配器中复制此行为.

考虑以下层次结构:

struct A
{
    unsigned a;
    virtual ~A() { }
};

struct B
{
    unsigned b;
    virtual ~B() { }
};

struct C : public A, public B
{
    unsigned c;
};
Run Code Online (Sandbox Code Playgroud)

我想分配一个C类型的对象,并通过类型B的指针删除它.据我所知,这是一个有效的使用operator delete,它在Linux/GCC下工作:

C* c = new C;
B* b = c;

delete b;
Run Code Online (Sandbox Code Playgroud)

有趣的是,指针'b'和'c'实际上指向不同的地址,因为对象在内存中的布局方式,而删除操作符"知道"如何查找和释放正确的内存位置.

我知道,一般来说,在给定基类指针的情况下找不到多态对象的大小是不可能的:找出多态对象的大小.我怀疑通常不可能找到对象的真实内存位置.

笔记:

c++ memory-management g++

28
推荐指数
3
解决办法
2924
查看次数