2012 Microsoft Intern Hiring Written Test : 6

6. Which of following C++ code is correct :

(A)

int f()
{
	int* a = new int (3);
	return *a;
}

(B)

int* f()
{
	int a[3] = {1, 2, 3};
	return a;
}

(C)

vector<int> f()
{
	vector<int> v(3);
	return v;
}

(D)

void f(int* ret)
{
	int a[3] = {1, 2, 3};
	ret = a;
	return ;
}

(E) none of above

问题分析:

(A) 内存泄漏(Memory Leak)

 int* a = new int (3);    //使用new在堆上分配内存,并初始化为3

return *a;    // 返回指针a所指内容的一个副本,而不是指针*a本身。

由于本函数结束后,并没有对分配的堆内存进行delete,这样你就不能再对这块内存进行重新分配;

由于在函数返回后,并没有返回在堆上分配内存的地址,这样就不能访问在堆上分配内存的内容;

所以,最终将会导致内存泄漏。

(B) Garbage Value

int a[3] = {1, 2, 3};    // 数组在栈上分配内存

return a;    // 返回数组首地址

由于数组a是在栈上分配内存,所以函数结束后栈上的内容将出栈,当你通过return a;获得数组首地址后,试图通过该地址再次进行栈内存时,将会导致获取垃圾值。

(C) Right Answer

vector<int> v(3);    // vector在堆上分配3个int的内存,并默认初始化为0

(D) 同B类似

综上分析:我的答案是C。如果有错误的地方,请大家指正!吐舌头

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值