我要回到学校,我们必须参加C ++课程。 我熟悉这种语言,但有一些我从未听说过的事情......
一般来说,我的老师说普通的C ++是“不安全的”。它生成“不安全的代码”(无论这意味着什么)。这就是为什么我们必须使用C ++ / CLI来制作“安全”的代码。
现在...... CLI不仅仅是Microsoft .NET扩展吗?
他还告诉我们使用Console::WriteLine()
代替cout
。由于Console::WriteLine()
是“安全的”而cout
是“不安全的”。
这一切对我来说都很奇怪......任何人都可以澄清一下吗?
谢谢!
答案 0 :(得分:7)
通过“安全代码”,您的老师可能意味着托管代码。这是你不必“关心”指针和内存的代码,你有一个垃圾收集器来处理你的问题。你正在处理引用。像这样构建的语言的例子是java和c#。代码被编译为“虚构”操作码(中间语言,IL for C#),并编译和运行实时(JIT,及时编译)。 IL生成的代码必须转换为真正的基于本机平台的操作码,在java中这是jvm所做的事情之一。您可以轻松地从这些语言中反汇编代码。并且它们可以在几个平台上运行而无需重新编译。
通过“不安全代码”,教师意味着普通的原生c ++ 非托管代码,其中所有内存和资源管理都由您处理。这为人为错误,内存泄漏,资源泄漏和其他内存错误留出了空间,通常不会在托管语言中处理。它还编译为纯字节码(本机程序集操作码),这意味着您必须为要定位的每个平台编译代码。您将遇到必须为每个平台制作大量特定代码,具体取决于您要编写的代码。很高兴看到线程相关的简单事物,例如线程依赖,现在是c ++标准的一部分。
然后你有c ++ / CLI,基本上是混合。您可以在c ++中使用.net框架中的托管代码,它可以用作桥接器,并用于创建包装器。
Console::WriteLine()
是托管的.net代码,安全。
cout
是来自<iostream>
的标准iso c ++,不安全
You find a related post here, with a broader answer here和here:)
正如Deduplicator在is also of interest for you
之下所指出的那样希望它有所帮助。
干杯
答案 1 :(得分:4)
在.NET世界中,&#34; safe&#34;是&#34;可验证的&#34;的同义词类型安全。在Visual C ++中,它由/clr:safe
启用。
/clr:safe
将阻止您使用std::cout
或本机代码中实现的任何其他函数或类型,因为本机函数不存在.NET验证程序所需的元数据。 Stigandr提到的MSIL可以用于即时编译,但即使在提前执行本机代码编译时,MSIL也会与编译的本机代码一起提供,并作为验证器检查的类型安全性的证明。
标准(本机/非托管)C ++在编译期间检查类型安全性。但是,这可以通过强制类型转换来禁用,如果没有运行时类型检查,C ++不提供该语言的一部分,指针算法(例如,数组索引超出范围)也可能违反类型安全性,就像使用指向释放对象的指针一样。 C ++不仅仅是一种语言,它也是一个标准库,您可以在其中找到执行必要运行时检查的智能指针和智能集合,因此它可以像任何托管框架一样安全。