关于C++里边的new和delete

Xiaowuasa 2009-04-09 03:56:29
下边四个选项中只有一个是对的,选出你的答案,并说明这个选项正确的理由,其他选项不对的理由


A,使用new操作符,可以动态分配全局堆中的内存资源
B,若P的类型由A强制转换为void*,那么执行语句delete P*时,类A的析构函数不会被调用
C,实现全局函数时,new和delete通常成对的出现在由一对匹配的花括号限定的语句块中
D,执行语句 A*P=new A[100]时,类A的构造函数只会被调用一次


“小屋阿萨”谢谢了,呵呵……
...全文
196 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
铭毅天下 2012-07-19
  • 打赏
  • 举报
回复
class CBase
{
public:
CBase() { cout << "CBase is running!\n";}
~CBase() { cout << "~CBase() is running!\n";}
};


int main()
{
//选项B错误
CBase * pBase = new CBase; //调用构造函数
void * pVoid = (void *)pBase;
delete pVoid; //肯定不會調用类A的析构函数

//选项D错误
CBase *pBaseN = new CBase[100]; //调用构造函数100次
delete []pBaseN; //调用析构函数100次

return 0;
}
hiboys 2009-04-10
  • 打赏
  • 举报
回复
a
gao125210 2009-04-10
  • 打赏
  • 举报
回复
D显然不对啊,怎么可能?
Xiaowuasa 2009-04-10
  • 打赏
  • 举报
回复
A说的是全局堆,全局堆就是所有未分配的空间,它包括了栈区、但只能分配堆区的空间
Xiaowuasa 2009-04-10
  • 打赏
  • 举报
回复
个人当时做这道题的时候选的是B,可正确答案是D……
jackyjkchen 2009-04-10
  • 打赏
  • 举报
回复
说实话,这种考试和考级时喜欢出的细节题我感觉用处不大……哪怕能做100分也比不上一个自己编一个实用程序
melonsmile 2009-04-10
  • 打赏
  • 举报
回复

B正确,试过了;
C,D错误。

A哪里错了?
yshuise 2009-04-09
  • 打赏
  • 举报
回复
A ?假如我对new操作符进行重载,让它调用栈的内存。
bfhtian 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jame2001 的回复:]
D 我實際操作了...是錯的, 會调用100次
B 題目有問題,如果是
A * p = new A;
void * t = (void *)p;
delete t; //肯定不會調用类A的析构函数
[/Quote]
但题目中是delete p,还是要调用A的析构函数的
Jalien 2009-04-09
  • 打赏
  • 举报
回复
B肯定是对的 因为转换为void类型的指针时丢失了类型信息,编译器不知道调用哪个类的析构函数,但是这块内存空间释放了
黄志义 2009-04-09
  • 打赏
  • 举报
回复
A、win32里不区分全局堆和局部堆
B、A * p = new A; void * t = (void *)p; delete t; //肯定不會調用类A的析构函数
C、没看懂
D、显然会调用100次构造函数
sayoath 2009-04-09
  • 打赏
  • 举报
回复
我选A
使用new操作符,可以动态分配全局堆中的内存资源
new 当然是NEW 在堆中的 自己NEW出的东西也要自己删除 new 不就是动态分配嘛
bruce_nie 2009-04-09
  • 打赏
  • 举报
回复
B
Dinelgua 2009-04-09
  • 打赏
  • 举报
回复
选B

A * p = new A;
delete (void*)p; //不会调用A的析构

A,使用new操作符,可以动态分配全局堆中的内存资源
A也没发现哪里不对,单全局堆这个词第一次见 如果就是我们常说的堆内存,那应该没有问题

C,实现全局函数时,new和delete通常成对的出现在由一对匹配的花括号限定的语句块中
这句话也说的莫名奇妙 看不出错来 暂且认为对吧

D,执行语句 A*P=new A[100]时,类A的构造函数只会被调用一次
产生100个A对象 肯定调用100词构造函数
jame2001 2009-04-09
  • 打赏
  • 举报
回复
D 我實際操作了...是錯的, 會调用100次
B 題目有問題,如果是
A * p = new A;
void * t = (void *)p;
delete t; //肯定不會調用类A的析构函数
pb215574980 2009-04-09
  • 打赏
  • 举报
回复
显然选D
speeder53 2009-04-09
  • 打赏
  • 举报
回复
mk
黄志义 2009-04-09
  • 打赏
  • 举报
回复
B

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧