首页 > 试题广场 >

以下涉及到内存管理的代码段中,有错误的是:

[不定项选择题]
以下涉及到内存管理的代码段中,有错误的是:
  • int *a=new int(12);
    //..... 
    free(a);
    
  • int *ip=static_cast<int*>(malloc(sizeof(int)));
    *ip=10;
    //.....
    delete ip;
  • double *a=new double[1];
    //.... 
    delete a;
  • int *ip=new int(12);
    for(int i=0;i<12;++i){
    ip[i]=i;
    }
    delete []ip;
推荐
new和delete搭配,malloc和free搭配,所以A、B是错的。
关于D,注意new int(12)和new int[12]的区别。new int(12)是生成了一个值为12的int变量,new int[12]才是生成一个大小为12的数组。所以,delete []ip是错误的,D错。
再看C,乍一眼看过去,a是一个数组,应该用delete []a,但是在基本类型数组来说,delete a和delete []a的效果是一样的。如果,a是一个自定义对象的数组,那么只能用delete []a。

关于delete a和delete []a的区别,请参照
http://jazka.blog.51cto.com/809003/230220
编辑于 2016-04-04 21:13:20 回复(9)
new 和delete 配套使用  free和malloc配套使用 AB错误
D是因为申请的是一个元素,后面跟的12是初始化值,而不是数组,所以错误。
new和delete与free和malloc的差别是前面2个会分别调用构造函数和析构函数
发表于 2015-09-08 16:00:00 回复(3)
D选项是错在访问越界了,只申请了一个int。
另外,对于基本数据类型,delete和delete[]时无所谓的,两者的区别体现在对于对象类型的处理上,因为delete[]要为对象数组的每个对象调用析构,所以他要对对象的个数做一个记录,这个记录保存在申请空间的前四个字节,也就是你new[]出来的空间,它返回给你使用的地址实际上偏移了4个字节,那四个字节它自己用了。所以,如果new[]出来一个对象数组,你用delete去释放就会崩溃,因为它不知道前面还有四个字节。
比如有个类A,A* pA = new A[10];
你如果想用delete而不崩溃也是可以实现的,你只需要自己把释放的地址往前面移动四个字节。
delete (A*)((int*)pA-1),这样写,还是有问题的,但是至少不会像delete pA一样直接崩溃了。
发表于 2016-08-13 22:21:21 回复(0)
感觉c也是错误的,既然是用分配数组的方式分配内存,那就应该delete[],除非编译器会做优化,但这样的话,又会和其它大小的数组分配、回收方式不同,感觉编译器不会做这种优化,
发表于 2015-09-08 16:34:01 回复(3)
关于C,delete a只会把数组a的第一个元素所占的空间释放掉,但C中,new出来的数组a只有一个元素,所以,释放数组的第一个元素和释放整个数组在实际效果上是等价的,即delete a和delete[] a在效果上是等价的,都不会造成内存泄露。从这个角度讲,C就是对的。
发表于 2016-03-28 20:11:39 回复(0)
打c这种擦边球有意思么?
发表于 2016-05-28 22:47:10 回复(0)
A 错误  new 和 free 不搭配
B 错误 malloc 和delete 不搭配
C 错误 new[] 和 delete不搭配  
D 错误 new 和 delete[] 不搭配
发表于 2015-09-09 20:56:22 回复(1)
A错:c++中指针内存空间动态分配和收回使用new和delete。c对
D错:使用()是给指针类型赋初值,使用[]才能new出来数组
发表于 2022-03-19 20:34:59 回复(0)
两个原则:
1、new 和 delete 搭配,malloc 和 free 搭配
2、对于基本类型数组,delete a 和 delete []a 的效果是一样的。但是对于自定义对象的数组,那么只能用 delete []a。

另外,从另一个角度来看,由于 C 选项 a 数组只有一个元素,delete a 和 delete []a 效果是相同的
发表于 2018-04-25 10:27:19 回复(0)
C的错误在于循环越界,只分配1个元素空间,for循环里却使用了12个。
归根结底是把new int[12]和new int(12)搞混了
前者是分配12个元素,后者是分配1个元素并赋初值为12
发表于 2018-05-20 22:36:54 回复(0)

但是实际敲代码,只要不是涉及对象,malloc free new delete这几个可以混用的。所以AB用起来是没问题的

发表于 2017-08-31 14:24:26 回复(0)
牛客网真的好多错啊。其实new和free可以混用的,并没有错。
发表于 2017-05-31 10:02:48 回复(1)
成功地避开了正确答案。。。。
发表于 2016-09-11 10:53:13 回复(0)
c++4.2.1 apple llvm 6.1.0
测试4个都正常。。。。
发表于 2015-09-09 09:43:18 回复(5)
对D有疑问的是因为 。。new int(4)和new int[4]没有区分。呵呵,前者是分配一个int型初始化为4 。后者是分配包含4个整型的数组。虽然越界访问错误是个附带问题,但是最根本的问题是因为delete[]和new未匹配。
发表于 2016-12-07 08:47:34 回复(0)
delete只是调用了析构和free以及一些成员变量的默认析构,而对于int,调用delete和free并无区别,调用new和malloc类似。 最后一个选项,也不会报错,但是内存没有全部释放
发表于 2016-10-13 08:41:09 回复(1)
new和delete必须配套使用
new int(4),表示调用int类型的含有一个参数的构造函数
new int[4],表示申请4个int
发表于 2015-09-08 16:03:14 回复(0)
1. new int(n)产生一个值为n的int型变量并分配空间,区别 new int[n]产生n个int型变量 2. 对于基本数据类型delete[ ]与delete等效,但是对于自定义数据类型delete与delete[ ]不同
发表于 2019-11-13 01:25:23 回复(0)
D 不是数组啊  又看错了~~~~~~~~~~~~~~
发表于 2019-08-29 23:13:34 回复(0)
垃圾题目  
发表于 2024-07-25 13:49:41 回复(0)
c++标准中认为c选项是未定义行为
编辑于 2024-06-15 13:43:20 回复(0)