C++引用的正确使用--从常见的面试题说起系列2

C++中的引用使用起来还是比较方便的,但是对初学者也容易使用错误导致系统崩溃等问题。

因此也成为面试官们常问到的知识点。有这么一个问题:

class A

{

public:

    A(){m_pszContent = NULL;}

    virtual ~A(){delete[] m_pszContent;}

    char* m_pszContent;

}

void F()

{

    A a;   A& aa = a;

    .......  // 对aa进行操作,为m_pszContent申请内存等, 最后aa.m_pszContent  为“123”;

    if()

    {

        A b;

        ...... // 对b进行操作,为m_pszContent申请内存等

        aa = b;

        strcpy(aa.m_pszContent,“456”);

    }

    printf(a.m_pszContent);

}

请问最后打印的 a.m_pszContent 的字符串是什么?

如果你是面试者,你能准确的回答这个问题么?

 

其实这里面除了考了引用的使用方法外,还有一个知识点,=号运算符。

引用的特点:引用必须也只能是在定义的时候初始化。

因此其他非定义的地方给引用赋值,其实不是引用到新的对象,而是执行了一次赋值运算,会调用=号运算符,如果类没有重载=号运算符,则执行默认=号运算(即两个对象内容拷贝)

这个题目中,第一次aa引用a后,对aa操作其实也就是对a操作,a.m_pszContent 为 “123”

第二次aa = b; 时,实际是给a进行了赋值,这时a.m_pszContent 和 b.m_pszContent 指向同一个地址,前面a.m_pszContent 申请的内存泄漏了;

当出了 if 语句后,b析构了,将b.m_pszContent ,因为a.m_pszContent 跟b的地址相同,因此内存也释放了, a.m_pszContent为野指针。

后面再打印a.m_pszContent,则会出现不确定结果,甚至可能进程崩溃。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值