C/C++ 的注意事项和 Rust 的兴起
作者:互联网
C/C++ 的应用知识。
让我们首先了解为什么 Rust 在 C/C++ 的世界中对性能关键型应用程序和系统软件开发有意义。
随着时间的推移,我将指出我作为 C/C++ 程序员面临的一些注意事项。
不检查数组索引的 边界导致缓冲区溢出。
# include <stdio.h> # include <stdlib.h> # include <string.h> int check_authentication ( char *password) { int auth_flag = 0 ; char password_buffer[ 16 ]; strcpy (password_buffer, 密码); if ( strcmp (password_buffer, "brillig" ) == 0 ) auth_flag = 1 ; if ( strcmp (password_buffer, "outgrabe" ) == 0 ) auth_flag = 1 ; 返回auth_flag; } int main ( int argc, char *argv[]) { if (argc < 2 ) { printf ( "Usage: %s <password>\n" , argv[ 0 ]); 退出(0); } if (check_authentication(argv[ 1 ])) { printf ( "\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n" ); printf ( " 访问被授予。\n" ); printf ( "-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); } else { printf ( "\n访问被拒绝。\n" ); } } //代码来源:黑客:剥削的艺术,第 2 版
很容易产生严重的运行时错误,这些错误会使程序停止,例如“分段错误”——。
内存泄漏
由于 C/C++ 程序没有自动释放动态分配内存的内存管理例程,程序员需要通过手动释放内存来确保它已被释放。我们是程序员,我们确实会忘记释放内存,或者有时我们不了解应用程序的逻辑,不可避免地会将内存留在内存池中,而这些内存是程序无法访问的。这种情况称为内存泄漏。当它是一个需要像 Web 服务器一样全天候 24/7 运行的高可用性守护程序时,情况会变得更糟。
数据竞赛
很多时候在编写并发模块时,我们最终会由于数据竞争而导致结果不一致。~~C++ 标准还定义了术语数据竞争,表示由于对单个对象的并发修改而出现的特定类型的竞争条件。~~ C++ 并发实战