关于 new 出来的内存

u0116snail 2015-07-13 12:48:45
new 申请的内存,一定是在堆上吗? new 出来的内存,除了堆,还可以在什么位置?
...全文
406 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
eziowayne 2015-07-16
  • 打赏
  • 举报
回复
引用 18 楼 lm_whales 的回复:
重载 new,delete 不会改变的是 replacement new 在某个现有内存上,创建对象 new ,先分配内存,再在这块内存上,创建对象 delete 先析构对象,再释放内存 new[] ,先分配一块存放一定批量的对象的内存,再在这块内存上,批量分别创建对象 delete[] 先析构内存上的批量对象,再释放这一块内存 这种语义 是 重载 new,delete 所不能改变的 能改变的是, 1)在哪里分配内存, 2)除了实际需要的内存之外,额外分配多少内存,来处理内存管理的需要。 3)甚至还可以通过一定手段 改变, 内存不足时的处理策略。
就LS还算答到点子上了
lm_whales 2015-07-16
  • 打赏
  • 举报
回复
重载 new,delete 不会改变的是 replacement new 在某个现有内存上,创建对象 new ,先分配内存,再在这块内存上,创建对象 delete 先析构对象,再释放内存 new[] ,先分配一块存放一定批量的对象的内存,再在这块内存上,批量分别创建对象 delete[] 先析构内存上的批量对象,再释放这一块内存 这种语义 是 重载 new,delete 所不能改变的 能改变的是, 1)在哪里分配内存, 2)除了实际需要的内存之外,额外分配多少内存,来处理内存管理的需要。 3)甚至还可以通过一定手段 改变, 内存不足时的处理策略。
lm_whales 2015-07-16
  • 打赏
  • 举报
回复
引用 15 楼 GKatHere 的回复:
。。。。 重载new倒是分配内存, 可那还算new吗? 只能算一个特殊名称的函数吧 。。。。。
重载new虽然只是重载了一个函数, 但是 只要你重载的函数格式是对应的那个 当你写 new xxx; 这种代码的时候,分配内存 就改成调用你重载的那个 operator new 函数了, 而不再使用,编译器提供的内存分配代码了。 new 和 delete 的重载,会影响程序内存分配代码实现的。 一旦在某个作用域内重载了,某种格式 的 operator new() ,operater delete() 那么编译器提供的对应形式 的代码,在某个作用域内就会弃置不用,改用你自己重载的那个。
Ann_day 2015-07-16
  • 打赏
  • 举报
回复
new在c++中是个操作符,是可以被重载的,随意分配到任何地方, 重载的时候一般作为内存的管理比较多
lkliang77 2015-07-16
  • 打赏
  • 举报
回复
按照我的理解只能是堆;堆和栈,如果还有其他地方的话没理由教材不说出来啊,不过具体堆和栈又是怎么设计出来的就不清楚了
GKatHere 2015-07-15
  • 打赏
  • 举报
回复
引用 11 楼 u011642451 的回复:
[quote=引用 10 楼 king191923157 的回复:] [quote=引用 5 楼 u011642451 的回复:] [quote=引用 3 楼 adlay 的回复:] new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。[/quote] 你没问面试官他的答案么?下次遇到这类问题要问问他?[/quote] 一家大央企,我当场也问了,不过面试官只是回答我:“new肯定是可以在其他地方分配内存的!”。 然后他就转向问其他问题了。[/quote] 注意了, :“new肯定是可以在其他地方分配内存的!”, 是 "分配内存", replacement new 根本没有分配内存. 重载new倒是分配内存, 可那还算new吗? 只能算一个特殊名称的函数吧 .//全局new操作符 .void * __cdecl operator new(size_t size,POOL_TYPE PoolType=PagedPool) { KdPrint(("global operator new\n")); KdPrint(("Allocate size :%d\n",size)); return ExAllocatePool(PagedPool,size); }
reader1 2015-07-15
  • 打赏
  • 举报
回复
引用 15 楼 GKatHere 的回复:
[quote=引用 11 楼 u011642451 的回复:] [quote=引用 10 楼 king191923157 的回复:] [quote=引用 5 楼 u011642451 的回复:] [quote=引用 3 楼 adlay 的回复:] new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。[/quote] 你没问面试官他的答案么?下次遇到这类问题要问问他?[/quote] 一家大央企,我当场也问了,不过面试官只是回答我:“new肯定是可以在其他地方分配内存的!”。 然后他就转向问其他问题了。[/quote] 注意了, :“new肯定是可以在其他地方分配内存的!”, 是 "分配内存", replacement new 根本没有分配内存. 重载new倒是分配内存, 可那还算new吗? 只能算一个特殊名称的函数吧 .//全局new操作符 .void * __cdecl operator new(size_t size,POOL_TYPE PoolType=PagedPool) { KdPrint(("global operator new\n")); KdPrint(("Allocate size :%d\n",size)); return ExAllocatePool(PagedPool,size); } [/quote]
引用
重载new倒是分配内存, 可那还算new吗?
回答的好,
qsfool1987 2015-07-15
  • 打赏
  • 举报
回复
应用层也写内存管理,比如游戏引擎的基础库中就有用到
qsfool1987 2015-07-15
  • 打赏
  • 举报
回复
库提供的new操作确实是分配在堆栈上,new和delete是可以重载的,placement new更是可以在任何地方构造对象,这有什么用呢?答案就是实现内存管理,不用系统提供的内存管理系统,因为低效,在某些场合,特别是驱动层非常正常
赵4老师 2015-07-14
  • 打赏
  • 举报
回复
书到用时方恨少。
u0116snail 2015-07-14
  • 打赏
  • 举报
回复
引用 10 楼 king191923157 的回复:
[quote=引用 5 楼 u011642451 的回复:] [quote=引用 3 楼 adlay 的回复:] new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。[/quote] 你没问面试官他的答案么?下次遇到这类问题要问问他?[/quote] 一家大央企,我当场也问了,不过面试官只是回答我:“new肯定是可以在其他地方分配内存的!”。 然后他就转向问其他问题了。
ForestDB 2015-07-13
  • 打赏
  • 举报
回复
就是堆上,inplacement new和自定义new另论。
king191923157 2015-07-13
  • 打赏
  • 举报
回复
引用 5 楼 u011642451 的回复:
[quote=引用 3 楼 adlay 的回复:] new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。[/quote] 你没问面试官他的答案么?下次遇到这类问题要问问他?
www_adintr_com 2015-07-13
  • 打赏
  • 举报
回复
引用 8 楼 bear234 的回复:
[quote=引用 5 楼 u011642451 的回复:] [quote=引用 3 楼 adlay 的回复:] new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。[/quote] 一般没啥用确实 不过数据非常庞大的时候 还是很有用的[/quote] 如果要在嵌入式的系统里用 C++ 估计就必须重载 new 了,只不过嵌入式一般都不会用 C++ 吧
bear234 2015-07-13
  • 打赏
  • 举报
回复
引用 5 楼 u011642451 的回复:
[quote=引用 3 楼 adlay 的回复:] new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。[/quote] 一般没啥用确实 不过数据非常庞大的时候 还是很有用的
u0116snail 2015-07-13
  • 打赏
  • 举报
回复
引用 1 楼 ForestDB 的回复:
就是堆上,inplacement new和自定义new另论。
inplacement new 是个神马玩意?
u0116snail 2015-07-13
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
从这个角度说,倒挺对。恕我见识短浅,怎么感觉这挺鸡肋的,没有实用价值(面试官问了我这个问题,我回答说就是分配在堆上的,结果被鄙视……)。
sandshaw 2015-07-13
  • 打赏
  • 举报
回复
引用 3 楼 adlay 的回复:
new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
+1
www_adintr_com 2015-07-13
  • 打赏
  • 举报
回复
new 本身是可以重载的,你想 new 到哪里就可以把它重载到哪里
加载更多回复(1)

64,282

社区成员

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

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