C++ - 铸造空指针

发布于 2024-10-31 05:47:15 字数 537 浏览 1 评论 0原文

当您尝试将 void* 转换为它不是的东西时,C++ 是否会抛出运行时异常?

class Sheep
{
public:
    Sheep() { }

    ~Sheep() { }

    void Bah()
    {
        // Print Bah!
    }
};

class Unicorn
{
    Unicorn() { }

    ~Unicorn() { }

    void Stab(Sheep* s)
    {
        s->Bah();
    }
};


int main()
{
    Sheep sheep;

    void* ptr = (void*) &s;

    // I'm guessing this would be 'valid'
    Unicorn* unicorn = (Unicorn*) ptr;
    // This must go wrong..?
    unicorn->Stab(&sheep);

    return 0;
} 

Does C++ throw runtime exceptions when you try to cast a void* to something that it isn't?

class Sheep
{
public:
    Sheep() { }

    ~Sheep() { }

    void Bah()
    {
        // Print Bah!
    }
};

class Unicorn
{
    Unicorn() { }

    ~Unicorn() { }

    void Stab(Sheep* s)
    {
        s->Bah();
    }
};


int main()
{
    Sheep sheep;

    void* ptr = (void*) &s;

    // I'm guessing this would be 'valid'
    Unicorn* unicorn = (Unicorn*) ptr;
    // This must go wrong..?
    unicorn->Stab(&sheep);

    return 0;
} 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

神也荒唐 2024-11-07 05:47:15

当您尝试将 void* 转换为它不是的东西时,C++ 是否会抛出运行时异常?

不,事实并非如此。

你的程序的行为是未定义的:任何事情都可能发生。该程序可能在大多数时间都工作正常,但也可能随时崩溃,或者可能发生更糟糕的情况。

在 C++ 中,除少数罕见情况外,所有情况下都应避免使用 void*;您应该考虑使用类继承、多态性或模板来确保您的代码类型安全,而不是诉诸使用 void*。虽然 C++ 确实允许您编写类型不安全的代码,但它还提供了许多工具来帮助您编写类型安全的代码并使该代码更加直接、简单和正确。

Does C++ throw runtime exceptions when you try to cast a void* to something that it isn't?

No, it doesn't.

The behavior of your program is undefined: anything could happen. The program might appear to work most of the time, it might crash at any point, or something worse might happen.

void* should be avoided in all but a few rare cases in C++; instead of resorting to using void*, you should consider using class inheritance, polymorphism, or templates to be sure that your code is type safe. While C++ does allow you to write code that is not type safe, it also provides many tools that help you to write type safe code and make that code much more straightforward, simple, and correct.

琴流音 2024-11-07 05:47:15

不。如果你不能施展虚空*。你能用它做什么!?事实上,您必须对其进行强制转换,以便将其分配给其他类型的指针或取消引用它。

在您的示例中,您使用了 C 样式转换,C++ 支持几种更安全的转换运算符,例如 dynamic_cast< /code>确实在运行时测试强制转换的有效性。

No. If you could not cast a void*. what could you do with it!? In fact you must cast it in order to assign it to a pointer of some other type or dereference it.

In your example you used a C style cast, C++ supports several safer cast operators such as dynamic_cast which does test the validity of the cast at run-time.

一百个冬季 2024-11-07 05:47:15

不,不是。
这就是为什么在 C++ 中使用 void* 是不好的做法。

使用模板而不是 void*。它们是类型安全的。

void* 仅应在处理 C 代码时使用。

No, it isn't.
That's why using void* in C++ is bad practice.

Use templates instead of void*. they are type safe.

void* should be used only when you are dealing with C code.

扶醉桌前 2024-11-07 05:47:15

否。无论是在 C 中还是在 C++ 中
这是我们可以用这种语言完成的基本操作。

No. either in C or in C++
this is a basic operation we can do in this language.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文