C++语言99个常见编程错误 常见错误67:未能采用RAII(资源获取即初始化)习惯用法

常见错误67:未能采用RAII(资源获取即初始化)习惯用法
  很多新入行的C++软件工程师都体会不到构造函数和析构函数美妙绝伦的对称性。绝大
多数此类软件工程师都活在语言为他们准备的温室中,不用为指针和(手动)内存管理操心。
安全可靠。难得糊涂。所谓编程也只不过就是精确地按照语言设计者替人们一手安排好的
路子亦步亦趋。
  可喜的是,C++语言十分重视一线的实践者,为语言的用法提供了很大的灵活性。
  RAII(资源获取即初始化)。是一种易用,扩展性强的技术,用于将资源与内存绑定,而且
高效、可预期的方式加以管理。
  构造函数和析构函数的执行序列次序完全互逆。当class对象被构造的时候,其初始化执行
次序放之四海而皆准:虚基类子对象先被构造,接下来是它们的直接基类(子对象)以其在
class定义中基类列表的出现次序依次 构造,接下来是其数据成员以其声明次序依次构造,最后
执行的是构造函数的函数体。而析构函数则实现了完全逆向的执行次序:先执行析构函数的
函数体,再是数据成员以其声明次序值逆序依次析构,再是其直接基类(子对象)以其在
class对象的构造函数都必须以相同次序执行该初始化。
  异常安全的代码很少运用try语句块。它们使用RAII习惯用法。

  标准库中的auto_ptr模板是相当有用的、为从堆上分配的对象准备的通用型资源句柄。


trace.h
#ifndef TRACE_H
#define TRACE_H

#include <iostream>

class Trace {
  public:
    Trace( const char *msg )
        : m_( msg ) { std::cout << "Entering " << m_ << std::endl; }
    ~Trace()
        { std::cout << "Exiting " << m_ << std::endl; }
  private:
    const char *m_;
};

#endif

trace.cpp
#include "trace.h"

Trace a( "global" );
 
void loopy( int cond1, int cond2 ) {
    Trace b( "function body" );
it: Trace c( "later in body" );
    if( cond1 == cond2 )
        return;
    if( cond1-1 ) {
        Trace d( "if" );
        static Trace stat( "local static" );
        while( --cond1 ) {
            Trace e( "loop" );
            if( cond1 == cond2 )
                goto it;
        }
        Trace f( "after loop" );
    }
    Trace g( "after if" );
}


main.cpp
extern void loopy( int, int );
#include<iostream>

int main() {
	loopy( 4, 2 );
	getchar();
	return 0;
}


输出
Entering global
Entering function body
Entering later in body
Entering if
Entering local static
Entering loop
Exiting loop
Entering loop
Exiting loop
Exiting if
Exiting later in body
Entering later in body
Exiting later in body
Exiting function body

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C/C++语言编程安全子集是一种编程技术,旨在提供一种更加安全的编程方法,以减少程序中的安全漏洞和错误。 为了实现C/C++编程语言的安全子集,需要采取以下几个方面的措施: 1. 内存管理:C/C++语言在内存管理方面存在一些安全隐患,如内存泄漏、缓冲区溢出等。安全子集可以提供更加安全的内存管理工具或技术,如智能指针、内存安全检查等,以减少这些安全风险。 2. 输入验证:C/C++语言对用户输入的验证较弱,容易受到各种攻击,如SQL注入、缓冲区溢出等。安全子集可以提供更强大的输入验证工具或技术,如正则表达式、输入过滤等,以增强程序的安全性。 3. 安全函数:C/C++语言中存在一些不安全的函数,如strcpy()、sprintf()等,容易导致缓冲区溢出等安全问题。安全子集可以提供安全函数替代品,如strncpy()、snprintf()等,以减少这些安全风险。 4. 代码静态分析:安全子集可以提供代码静态分析工具,通过对程序的源代码进行分析,识别潜在的安全漏洞和错误,帮助程序员修复这些问题,提高程序的安全性。 5. 安全编码规范:安全子集可以提供安全编码规范,指导程序员编写安全的代码,包括如何处理用户输入、如何进行内存管理等,以减少程序中的安全漏洞。 总之,C/C++语言编程安全子集是一种通过采取各种措施来增强C/C++程序的安全性的编程技术。通过使用这种技术,程序员可以减少安全漏洞和错误,提高程序的可信度和鲁棒性。 ### 回答2: C/C++语言编程安全子集是指使用C/C++语言编写程序时,遵循一些规范和最佳实践,以确保程序的安全性和可靠性。下面是一些常见的C/C++语言编程安全子集的要点: 1. 错误处理:正确处理错误和异常,避免程序中断和崩溃。合理地使用try-catch语句块,及时捕获异常并进行必要的处理和恢复。 2. 输入验证:对所有输入数据进行验证和过滤,防止恶意输入和错误输入导致的安全漏洞。例如,使用正则表达式对输入进行格式检查,限制输入字符长度等。 3. 内存安全:合理地使用动态内存分配和释放操作,避免内存泄漏和缓冲区溢出。使用智能指针和RAII资源获取初始化)技术,确保资源的正确释放。 4. 安全算法和加密:在需要处理敏感数据或进行安全传输时,使用安全的算法和加密方法。例如,使用AES加密算法对数据进行加密,确保数据机密性和完整性。 5. 安全库函数:使用安全的库函数来替代不安全的函数,以减少安全漏洞的风险。例如,使用strncpy()代替strcpy(),使用snprintf()代替sprintf()等。 6. 安全编码规范:遵循安全编码规范,使用安全的编码风格和命名规则。例如,避免使用不安全的函数和不规范的变量命名,注重代码的可读性和可维护性。 7. 防止代码注入:对于用户输入的代码或数据,进行严格的验证和限制,避免恶意注入攻击。例如,使用参数化查询代替动态SQL查询,使用过滤器和白名单等。 总之,C/C++语言编程安全子集是一系列的安全编程准则和最佳实践,旨在保护程序免受常见的安全漏洞和攻击。开发人员应该积极采用这些准则,加强代码的安全性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值