概述
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,则会出现不确定结果,甚至可能进程崩溃。
最后
以上就是丰富冥王星为你收集整理的C++引用的正确使用--从常见的面试题说起系列2的全部内容,希望文章能够帮你解决C++引用的正确使用--从常见的面试题说起系列2所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复