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