为什么使用static_cast运算符的不安全强制转换不会崩溃
Why unsafe cast using static_cast operator do not crash?
请考虑以下示例代码。
#include <iostream>
using namespace std;
class base
{
public:
void func()
{
cout << "base::func()" << endl;
}
};
class derived : public base
{
public:
void func()
{
cout << "derived::func()" << endl;
}
};
void dummy(base *bptr)
{
derived *dptr = static_cast<derived*> (bptr);
dptr->func();
}
int main()
{
base bob1;
derived dob1;
dummy(&dob1); //Line1
dummy(&bob1); //Line2
}
在第1行中,我将派生类对象的地址传递给函数dummy
,该函数将指针指向基类对象。因此函数dummy
中的static_cast
是安全的。
在第2行中,我将基类对象的地址传递给函数。因此函数dummy
中的static_cast
是不安全的。
但是当我执行代码时,程序的行为是正常的。我认为,用not safe
这个词来说,程序应该在运行时崩溃。但没有发生坠机事件。
这是我得到的输出。
derived::func()
derived::func()
程序在运行时没有崩溃的原因是什么?
因为未定义的行为意味着任何事情都可能发生,而不一定是崩溃。
在我见过的大多数编译器上,调用一个不访问NULL
指针上的类成员的非virtual
方法是可行的,但它仍然是未定义的。
C++的核心概念之一是未定义行为。当你执行一个导致未定义行为的操作时,例如静态投射一个不指向投射类型对象的指针,你的程序的行为实际上是未定义的:标准没有定义任何特定行为。该平台不需要做任何具体的事情,根据标准,它表现出的任何行为都是可以的。
这种未定义的行为包括默默地做你认为正常的行为。无法保证出现分段故障或任何其他诊断。
相关文章:
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 具有重载类型转换运算符的函数对象崩溃
- size_t结构非数组成员崩溃的强制转换
- 将多面体转换为nef(违反访问)时,与CGAL崩溃
- 将MXArray转换为CV :: MAT时,程序会崩溃
- vtkProp::SafeDownCast() 在尝试转换 vtkactor 时崩溃
- 在CV :: MAT和Qimage之间进行转换会使程序崩溃
- 指针强制转换会导致 C++ 崩溃
- C++具有显式强制转换的代码,导致Visual Studio编译器崩溃
- 无法获得通过C++警告:(和崩溃后)已弃用从字符串常量到"char*"的转换 [-Wwrite-strings]
- 将指针类型转换为int会崩溃
- C++多个程序问题(rand、转换、崩溃)
- 为什么使用static_cast运算符的不安全强制转换不会崩溃
- 为什么我的C++程序在将 lambda 转换为函数指针时崩溃
- C++,从实用程序:string_t到标准::字符串的转换在返回时崩溃
- 火鸟在“UTF8 字符串转换为 wstring”时崩溃
- 将C++代码转换为C时程序崩溃
- 将uchar转换为int,然后转换为字符串会导致崩溃