dynamic_casting后删除指针是否安全
Is it safe to delete the pointer after dynamic_casting?
void foo(MyClass* myClass)
{
BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
delete myClass; // <-------------- Does this affects on pBaseClass ?
}
一般来说,dynamic_cast
实际上是如何工作的?(它像复制构造函数一样工作吗?
不,这不安全。 dynamic_cast
只是一个类型转换 - 原始指针和转换后的指针都指向同一对象。
转换后的指针可能会指向略有不同的地址(如果涉及多重继承(,但它仍然指向(in(同一个对象 - 不会发生对象复制。
编辑:我的意思是"不安全"的意思是"在你delete myClass
之后,pBaseClass
是一个悬而未决的指针。不过,它仍然是法典。只是很危险。
(请注意,class
不是有效的变量名,因为它是一个关键字。我把它叫做c
(。
dynamic_casting后删除指针是否安全?
是的;但请注意,删除它们指向的对象后,这两个指针都无效。之后不能使用任一指针值。
它将对类类型的指针或引用一般来说,dynamic_cast实际上是如何工作的?
转换为指向不同类类型的指针或引用,并在运行时检查转换是否有效。在这种情况下,如果BaseClass
与对象的动态类型相同或基类,则强制转换将成功(提供有效的指针(。否则它将失败(给出空指针(。
如果将*c
转换为引用类型,则失败将导致异常(std::bad_cast
(,因为没有空引用这样的东西。
它像复制构造函数一样工作吗?
不。复制构造函数用于复制对象。这不是复制它,只是更改指向它的指针的类型。副本看起来像
BaseClass bc = *c;
注意,bc
的类型是BaseClass
,而不是c
的类型(大概是从BaseClass
派生的类(;这被称为"切片",因为对象的派生部分被"切掉"而不是复制。
由于您正在处理指针,因此仅复制指针的值(即,只是地址(。
这是对类似代码的体面解释
C++ 强制转换会创建新对象吗?
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 'this'指针是否可以在 c++ 标头声明中使用?
- C++ 在向量中使用指针是否可能导致指针悬空?
- 唯一指针是否在堆或堆栈上分配内存?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何判断指针是否是指向数组的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 如何知道指针是否已在其他地方释放
- 结构成员指针是否自动初始化为零?
- 为静态类创建指向对象的指针是否合法?
- 新的自动关键字指针是否会自行删除?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 检查指针是否指向矢量元素
- 如何创建一个带锁的指针数组并检查指针是否空闲?
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?