在多个继承C 之间进行铸造和释放
Casting and freeing between multiple levels of inheritance c++
命令在铸造时是否很重要,这是否对使用虚拟基类释放对象有影响吗?例如。如果您提高了2个级别,则必须降低2个级别,或者您一次可以降低1级?
struct A {
virtual ~A() = default;
...
};
struct A_Extra : A {...};
struct B : A_Extra {...};
std::vector<A*> data;
void scenario1() {
// create sample object - incremental upcasting
A_Extra* b = new B();
data.push_back(b);
A* a = data.front();
// which one(s) of these casts are valid ?
B* option1 = static_cast<B*>(static_cast<A_Extra*>(a));
B* option2 = static_cast<B*>(a);
// which one(s) of these frees are valid ?
delete a;
delete static_cast<A_Extra*>(a);
delete static_cast<B*>(static_cast<A_Extra*>(a));
delete static_cast<B*>(a);
}
void scenario2() {
// create sample object
B* b = new B();
data.push_back(b);
A* a = data.front();
// which one(s) of these casts are valid ?
B* option1 = static_cast<B*>(static_cast<A_Extra*>(a));
B* option2 = static_cast<B*>(a);
// which one(s) of these frees are valid ?
delete a;
delete static_cast<A_Extra*>(a);
delete static_cast<B*>(static_cast<A_Extra*>(a));
delete static_cast<B*>(a);
}
施放时订单很重要
是的,命令在铸造时很重要。
这是否会影响释放...
您所显示的演员都没有效果。
...使用虚拟基类?
您的班级都没有虚拟基类。
例如。如果您提高了2个级别,则必须降低2个级别,或者您一次可以降低1级?
您可以一次上升和降低多个级别,并且您的降落比您的降低范围少。
// which one(s) of these casts are valid ?
两者都是有效的。
// which one(s) of these frees are valid ?
所有这些都是有效的(只要仅使用其中一个(。
答案适用于两个screnarios。
铸造到B*
和A_Extra*
可能是危险的,因为A*
可能无法指向这种类型的对象。在这些情况下,它们确实如此,如果您可以保证,那么演员阵容是有效的。如果无法保证,dynamic_cast
是一种更安全的替代方案。
无论如何,在两种情况下的所有演员阵容都是多余的。最好不要使用不必要的铸件。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 释放错误后堆使用
- 在cuda线程之间共享大量常量数据
- G锁定铸造到基础上会释放模拟行为
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 在将变量声明为引用时,堆在释放后使用
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 文件删除(使用取消链接)与释放所有磁盘空间之间的延迟
- 多个线程之间的获取-释放内存顺序
- 在多个继承C 之间进行铸造和释放
- MS Visual C 释放和调试构建之间的不同行为的可能原因
- 内存泄漏,访问释放内存和双重免费之间有什么区别
- 在C++中,获取/释放原子访问和结合围栏的放松访问之间有什么有效的区别吗
- 如何使用 boost::shared_ptr 安全地释放线程之间共享的对象
- 在循环执行之间释放内存
- C++11 是否保证释放围栏和使用操作之间的内存顺序