首页 > 试题广场 >

Which of following C++ code is

[单选题]
Which of following C++ code is correct?
  • int f() { int *a = new int(3); return *a; }
  • int *f() { int a[3] = {1, 2, 3}; return a; }
  • vector<int> f() {vector<int> v(3); return v; }
  • void f(int *ret) { int a[3] = {1, 2, 3}; ret = a++; return; }
推荐
因为C不存在内存泄露的问题且可以得到想要结果,但所有选项都是可以编译通过的,无语法错误。A是内存泄露,没有delete,B数组是临时的,根本传不到主调函数里,D的问题同B一样。
编辑于 2015-02-09 16:05:20 回复(15)
vector<typeName>v2(v1); vector<typeName> v2=v1; vector<typeName> v2(v1.begin(), v1.end());//v2 v1 的一个副本
A出现内存泄露

发表于 2016-06-08 10:57:34 回复(0)
A:看了很多人说的A是没有delete导致的内存泄漏,我认为A本身不delete是没问题的,只要函数返回指向这块内存的指针a即可,在函数外delete a也可以,但是函数返回一个int,而不是指针,导致这块内存无法再被访问和释放才导致内存泄漏。
B和D都是因为函数内定义的数组是局部变量,在函数返回后内存被释放,通过指针无法再访问。
C:调用构造函数创建对象,在函数返回后,会调用析构函数释放内存,注意是函数返回后才执行。而我们的函数返回的是值,而非地址, 所以谁care销不销毁呢。所以我看到有人说C对是因为可以复制拷贝,确实,对象作为返回值时,会调用拷贝构造函数生成一个临时对象,返回的也是临时对象的值,但是在函数返回后两个都会被销毁,返回的是值才是这个选项正确的原因。
编辑于 2016-11-30 15:38:29 回复(8)
D选项的错误之处是,当 a 为数组名时,可以当做一维指针进行取值运算,但是由于数组名等同于常量指针,所以不可以对数组名进行赋值运算。所以当a为数组时, a=任意表达式 这样的计算都是非法的。而a++,等效于a=a+1, 所以这种表达式一样是非法的,编译的时候会报错。
发表于 2018-06-11 20:56:29 回复(1)
谢谢大家提示!!!
A:和大家说的一样,new申请的内存在离开作用域时由于没有delete,导致内存泄漏。(这块内存对于系统来说是被占用的,但是实际上已经没有人使用了,所以这块内存永远无法释放!有兴趣的可以看看malloc的源码分析)
B:数组不能复制和拷贝
C:vector容器可以复制或拷贝
D:同B
当函数参数实例化形参或者函数返回值时,一般调用对象的拷贝构造函数!
编辑于 2016-08-01 12:17:23 回复(3)
A:返回数组第一个值之后销毁了指针a,无法再释放内存导致内存泄漏
B:返回一个局部变量
D:数组名不可修改。函数逻辑上也有问题,没有任何实际意义。

发表于 2018-06-27 10:01:02 回复(0)
规定了要谁申请谁释放吗?
A本身是没有错的
发表于 2016-07-07 10:37:41 回复(5)
B和D项,数组是临时的,在栈上存储的,所以无法传递到相应的位置。
发表于 2016-05-20 16:04:19 回复(0)
B中的地址可以返回,但它是一个临时地址,即使返回也不能使用,因为随时可能被更改,存在安全性问题。
发表于 2016-02-27 19:15:35 回复(0)
C中vector<int> v(3) 是定义具有3个整形元素的vector,且元素被初始化为0。调用的构造函数是:vector( size_type num, const TYPE & val = TYPE () );

                                                                                    
编辑于 2015-09-11 11:18:28 回复(0)
选项A中使用了new所以要人为的delete,否则存在内存泄露问题;选项B中 int a[3] 为局部数组,在程序运行结束局部变量会释放,因此不能将把局部变量的地址作为返回值;选项D中,void f(int *ret)中的形参是一个整型指针,将局部变量的值赋给ret造成错误。
发表于 2018-04-19 13:26:41 回复(0)
D跟B一样,都是临时对象,离开作用域会被销毁,虽然C内的vector也会被销毁,但是返回值是vector,会调用拷贝构造函数来初始化一个临时对象,并且将这个临时对象赋值给函数外我们想利用的对象。
发表于 2017-08-08 16:07:04 回复(0)
c中vector定义都错了,怎么能对呢?不是应该定义成vector<int>吗????
发表于 2015-07-26 10:01:30 回复(0)
D,数组名是常量,没法进行运算
发表于 2022-11-21 23:25:10 回复(0)
D_L头像 D_L
说D和 B 一样的真是无语了,D 只是改变了局部变量 ret 的指向而已,完全无公害,愣是调毛病的话,就是运行这个函数没有任何意义而已,“没有意义”就是错了吗?
发表于 2016-09-01 18:35:51 回复(2)
new建立的动态内存,不随生命周期结束而结束,必须手动释放,AC都是。然而A传回的是内容,原地址无法被释放了
发表于 2015-11-01 22:13:42 回复(0)
我是要作C语言的题,为什么老是出现C++的题
发表于 2021-11-09 21:41:22 回复(0)
A本身编译可以通过,但是可能只返回了一个值,导致内存泄漏。原意应该是想返回整块地址的。
B中a被释放了,所以编译不通过。
C正确
D的话a是数组名称,无法++。

发表于 2020-03-10 13:41:53 回复(1)
如果不是大量重复的new,也得自己delete吗?不需要吧?
虽然这个函数调用情况不知道,确实存在内存泄露的危险。
请大佬们回答一下我第一行的问题,我在这块存在困惑,谢谢。
发表于 2019-03-21 17:16:21 回复(1)
A:看了很多人说的A是没有delete导致的内存泄漏,我认为A本身不delete是没问题的,只要函数返回指向这块内存的指针a即可,在函数外delete a也可以,但是函数返回一个int,而不是指针,导致这块内存无法再被访问和释放才导致内存泄漏。 B和D都是因为函数内定义的数组是局部变量,在函数返回后内存被释放,通过指针无法再访问。 C:调用构造函数创建对象,在函数返回后,会调用析构函数释放内存,注意是函数返回后才执行。而我们的函数返回的是值,而非地址, 所以谁care销不销毁呢。所以我看到有人说C对是因为可以复制拷贝,确实,对象作为返回值时,会调用拷贝构造函数生成一个临时对象,返回的也是临时对象的值,但是在函数返回后两个都会被销毁,返回的是值才是这个选项正确的原因。
发表于 2018-11-28 14:48:10 回复(0)
推荐前三都忽略了一点,D选项,对于数组名,是无法进行自增自减操作的,可以看作是一个常量指针,无法修改它的指向。

编辑于 2018-11-01 10:55:56 回复(0)