如此printf,如此new,无语了!

tangshuiling 2009-03-11 10:43:57

一、
typedef void (*FunProc)(const char*);
FunProc test;
test=(FunProc)new (printf) FunProc; //仅以printf为例,实际中可能是别的函数
test("hello world");
二、
void (*fun)();
fun= *new (void(*)()); //个人认为内存泄漏了,无法回收
这种奇特的用法,可能你我一辈子也不会用到,个人认为无非就是一些炫耀技巧之辈的杰作!
想问的是:为何一些低层代码惯用如此伎俩,有何实用价值否?
...全文
208 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnStreamlet 2009-03-15
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 arong1234 的回复:]
2. 为什么不能回收? delete fun应该还可以用。
[/Quote]

int i = *(new int);

delete i?
Vitin 2009-03-15
  • 打赏
  • 举报
回复
呵呵,怎么说呢,当作游戏吧。

通过游戏了解语言的实现方式,就是这些 tricks 存在的意义吧。
arong1234 2009-03-15
  • 打赏
  • 举报
回复
1。 对placement new的滥用
2. 为什么不能回收? delete fun应该还可以用。
[Quote=引用楼主 tangshuiling 的帖子:]
C/C++ code
一、
typedef void (*FunProc)(const char*);
FunProc test;
test=(FunProc)new (printf) FunProc; //仅以printf为例,实际中可能是别的函数
test("hello world");
二、
void (*fun)();
fun= *new (void(*)()); //个人认为内存泄漏了,无法回收
这种奇特的用法,可能你我一辈子也不会用到,个人认为无非就是一些炫耀技巧之辈的杰作!
想问的是:为何一些低层代码惯用如此伎俩,有何实用价值…
[/Quote]
Learn-anything 2009-03-15
  • 打赏
  • 举报
回复
玄,还得好好理解一下
飞哥 2009-03-15
  • 打赏
  • 举报
回复
第一种确实没见过
第二种嘛,呵呵。。。,应该还好吧
SearchLife 2009-03-15
  • 打赏
  • 举报
回复
mark
cppzhentan 2009-03-12
  • 打赏
  • 举报
回复
汗..
jwpl190 2009-03-12
  • 打赏
  • 举报
回复
typedef void (*FunProc)(const char*);
FunProc test;
test=(FunProc)new (printf) FunProc; //仅以printf为例,实际中可能是别的函数
test("hello world");
不能编译通过,可以改成
typedef void (*FunProc)(const char*);
FunProc test;
test=(FunProc)new ((void*)printf) FunProc; //仅以printf为例,实际中可能是别的函数
test("hello world");
也是gcc4.4

Guilty 2009-03-12
  • 打赏
  • 举报
回复
80岁以后再来研究
weidong0210 2009-03-12
  • 打赏
  • 举报
回复
汗 高。。。
  • 打赏
  • 举报
回复
mark先,我以前看别人的系统启动代码,也是一堆疑问,为何做很多无用功。
感觉还是应该放在特定的环境里讨论。
xtting_8984313 2009-03-12
  • 打赏
  • 举报
回复
我倒是觉得如果底层开发的话,或许还是有必要的。

这种做法因该可以模拟hook之类的操作,让函数调用可以动态绑定。

没有研究过内核,感觉而已。
taodm 2009-03-12
  • 打赏
  • 举报
回复
楼主用的啥编译器,例1能编译通过?
我gcc4.4,编译不过。
booksky508 2009-03-11
  • 打赏
  • 举报
回复
从来没见过
Cpp权哥 2009-03-11
  • 打赏
  • 举报
回复
没有意义的用法。
Chevin 2009-03-11
  • 打赏
  • 举报
回复
能否将语句分解解析下?!
chin_chen 2009-03-11
  • 打赏
  • 举报
回复
void (*fun)();
fun= *new (void(*)());

跟这个道理一样。
int i;
i=*new int;
有什么好奇怪的。这样内存肯定丢失啊。
zhangchaokun 2009-03-11
  • 打赏
  • 举报
回复
这两个确实很炫,但华而不实,我觉得就是在一些认证之类的考试会出现吧
lingyin55 2009-03-11
  • 打赏
  • 举报
回复
确实很炫
Chevin 2009-03-11
  • 打赏
  • 举报
回复
mark
加载更多回复(4)

64,683

社区成员

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

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