布局new操作的问题请教:

wycfgq 2009-11-26 08:14:48
布局new操作的问题请教:
1.为何声明的静态数组arr1 是 char 型,我在main()中依然可以用
p2=new(arr1) int;呢?这样是整型呀?
类型不同的栈区,也可以混用吗?
2.为何用 new (arr1) int 这种方式 new 出来的内存,不能用 delete 释放呢?


#include <iostream>

char arr1[10];

int main()
{
using std::cout;
using std::endl;
int *p1;
int *p2;
p1=new int;
p2=new (arr1) int[10];

*p2=20;
*p1=10;
cout << *p1 << endl;
cout << *p2 << endl;
delete p1;
//delete p2; //为何这一句释放会报错呢?
return 0;
}

...全文
139 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wolffan3150 2009-11-26
  • 打赏
  • 举报
回复
学习下
abc25485808 2009-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 supermegaboy 的回复:]
1.为何声明的静态数组arr1 是 char 型,我在main()中依然可以用
p2=new(arr1) int;呢?这样是整型呀?
---------------------------------
布局new只是利用其它方法所开辟的空间,至于原来空间的逻辑关系是怎样的与它无关。
[/Quote]
第一个我不太清楚,char一个字节,int俩字节,内存大小不够,应该抛异常啊。还是说在已经分配好的内存上编译器不判断内存大小是否和定义的对象占用的内存大小匹配
abc25485808 2009-11-26
  • 打赏
  • 举报
回复
new (arr1) int[10];
这种形式属于placement new,就是说在已经分配的内存上初始化一个对象,只需要调用对应的placement delete析构该对象即可.
建议lz看看operator new、new、placement new的区别.More effective C++条款08有介绍
WingForce 2009-11-26
  • 打赏
  • 举报
回复
另外,如果new的对象有有效的析构器,需要显式调用


飞天御剑流 2009-11-26
  • 打赏
  • 举报
回复
1.为何声明的静态数组arr1 是 char 型,我在main()中依然可以用
p2=new(arr1) int;呢?这样是整型呀?
---------------------------------
布局new只是利用其它方法所开辟的空间,至于原来空间的逻辑关系是怎样的与它无关。


2.为何用 new (arr1) int 这种方式 new 出来的内存,不能用 delete 释放呢?
-------------------------------------------------------------------
因为delete假定释放的内存属于堆空间,而布局new是在已有空间的基础上分配的,不能使用delete释放。

65,210

社区成员

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

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