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。如果有错误的地方,请大家指正!