假設我們有一個具有這種類繼承的 C 程式:
class A {
public:
virtual ~A() {/* ... */}
};
class B : public A {
public:
virtual ~B() {/* ... */}
};
class C : public A {
public:
virtual ~C() {/* ... */}
};
此外,有專門的記憶體限制,要求 B 和 C 必須始終分配在 RAM 的特殊區域中(例如,物理 SRAM 的保留區域,保證比普通 SDRAM 更快的回應時間),因此我們絕不能分配 B 的實體或來自一般堆的 C。所以我們可能有類似的東西:
A * ptr;
if(condition) {
ptr = specialized_allocator(sizeof(B));
new(ptr) B;
} else {
ptr = specialized_allocator(sizeof(C));
new(ptr) C;
}
/* Do something, which persists beyond the scope
of the function where allocation occurred... */
ptr->~A();
specialized_deallocator(ptr);
在這種情況下,完整的派生類解構式鏈會被正確呼叫,還是最終只呼叫頂級 A 解構式?
uj5u.com熱心網友回復:
運行它,它可能會有所幫助:
#include <iostream>
class A {
public:
virtual ~A() { std::cout << "A\n"; }
};
class B : public A {
public:
virtual ~B() { std::cout << "B\n"; }
};
class C : public A {
public:
virtual ~C() { std::cout << "C\n"; }
};
int main()
{
A* ptr = new C(); // or A* ptr = new B()
// ...
ptr->~A();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477241.html
上一篇:為什么gcc在優化時默認使用size-awaredelete運算子?
下一篇:遍歷串列元素
