ecos中new重载(magic new)迷惑

老腊肉泡酒 2009-09-11 04:06:04
关于重载就不说了,就是后面的t=t是怎么回事啊?请高手解析解析。谢谢

// -------------------------------------------------------------------------
// Magic new function

inline void *operator new(size_t size, void *ptr)
{
CYG_CHECK_DATA_PTR( ptr, "Bad pointer" );
return ptr;
}



externC void cyg_interrupt_create(
cyg_vector_t vector, /* Vector to attach to */
cyg_priority_t priority, /* Queue priority */
cyg_addrword_t data, /* Data pointer */
cyg_ISR_t *isr, /* Interrupt Service Routine */
cyg_DSR_t *dsr, /* Deferred Service Routine */
cyg_handle_t *handle, /* returned handle */
cyg_interrupt *intr /* put interrupt here */
)
{
CYG_ASSERT_SIZES( cyg_interrupt, Cyg_Interrupt );

Cyg_Interrupt *t = new((void *)intr) Cyg_Interrupt (
(cyg_vector)vector,
(cyg_priority)priority,
(CYG_ADDRWORD)data,
(cyg_ISR *)isr,
(cyg_DSR *)dsr );
t=t;

CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
*handle = (cyg_handle_t)intr;
}
...全文
297 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzhao86 2009-10-13
  • 打赏
  • 举报
回复
天呀,我连new重载都没搞懂,谁能解释一下,这个重载new的用法啊
mengde007 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 fallening 的回复:]
好像某些公司内部有程序中一个warning扣多少钱的规定,于是各类消warning的skill纷纷出现了:)
[/Quote]
就这个了;
zgjxwl 2009-09-11
  • 打赏
  • 举报
回复
去掉看会出现什么问题?
fallening 2009-09-11
  • 打赏
  • 举报
回复
一个变量如果只定义而不使用的话,编译器会给出warning
而如果有了t=t;这一句,这个warning就消除了

好像某些公司内部有程序中一个warning扣多少钱的规定,于是各类消warning的skill纷纷出现了:)
q88926273 2009-09-11
  • 打赏
  • 举报
回复
我也迷惑,,,
linux_is_perfect 2009-09-11
  • 打赏
  • 举报
回复
gcc -Werror就不只是warning 了
老腊肉泡酒 2009-09-11
  • 打赏
  • 举报
回复
应该不对。因为这是ecos最核心的部分。不会有只会消除warning的代码吧。哈哈
[Quote=引用 21 楼 jean7155 的回复:]
我理解 intr 是预先分配的一块内存的地址,传入 new 的重载 后,就直接返回了。
而 t=t;是消除变量没有被使用的warning 用的。

不知道对不对。


[/Quote]
jean7155 2009-09-11
  • 打赏
  • 举报
回复
我理解 intr 是预先分配的一块内存的地址,传入 new 的重载 后,就直接返回了。
而 t=t;是消除变量没有被使用的warning 用的。

不知道对不对。

jean7155 2009-09-11
  • 打赏
  • 举报
回复
还没有看懂,mark先
老腊肉泡酒 2009-09-11
  • 打赏
  • 举报
回复
((void *)intr)
intr这个在operator new里面好像没有用到啊?何解呢?呵呵。谢谢。
[Quote=引用 18 楼 yshuise 的回复:]
ptr就是指定的地址。


[/Quote]
yshuise 2009-09-11
  • 打赏
  • 举报
回复
ptr就是指定的地址。

老腊肉泡酒 2009-09-11
  • 打赏
  • 举报
回复
但是在operator new的时候并没有指定到具体的地方啊。。我看到那个operator new里面应该只是用那个宏检查了一下指针的合法性啊。
inline void *operator new(size_t size, void *ptr)
{
CYG_CHECK_DATA_PTR( ptr, "Bad pointer" );
return ptr;
}


[Quote=引用 13 楼 yshuise 的回复:]
定位new的用法。把构造一个对象放在一个指定的地址上。
[/Quote]
qq539929779 2009-09-11
  • 打赏
  • 举报
回复
功能上是一定没有用的,应是消除警告的吧!
linux_is_perfect 2009-09-11
  • 打赏
  • 举报
回复
特别要感谢yshuise

你用C++写多长时间程序了?
linux_is_perfect 2009-09-11
  • 打赏
  • 举报
回复
以前不会这样玩, 学习了...替楼主先谢谢各位了
yshuise 2009-09-11
  • 打赏
  • 举报
回复
定位new的用法。把构造一个对象放在一个指定的地址上。
linux_is_perfect 2009-09-11
  • 打赏
  • 举报
回复
这样做的目的是什么?

让生成的对象在指定的mem位置?
yshuise 2009-09-11
  • 打赏
  • 举报
回复
Cyg_Interrupt *t = new((void *)intr) Cyg_Interrupt (
(cyg_vector)vector,
(cyg_priority)priority,
(CYG_ADDRWORD)data,
(cyg_ISR *)isr,
(cyg_DSR *)dsr );
t=t;//这句明显是冗余了,因为下面使用的是intr指针。这句根本没有被使用。

CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
*handle = (cyg_handle_t)intr;
yshuise 2009-09-11
  • 打赏
  • 举报
回复

#include "stdafx.h"
#include <iostream>
class B:public A{
public:
void virtual fun(){
std::cout<<"B!"<<std::endl;
}
inline void *operator new(size_t size, void *ptr)
{
return ptr;
}
};

int _tmain(int argc, _TCHAR* argv[])
{

char* p = (char*)malloc(sizeof(B));
new(p)B;
}

我这样写是没有问题的。
估计如taodam所说,消除警告,因为,t这个变量根本没有使用只是一个临时变量。
所有有警告。但事实上这句完全可以这样写:
new((void *)intr) Cyg_Interrupt (
(cyg_vector)vector,
(cyg_priority)priority,
(CYG_ADDRWORD)data,
(cyg_ISR *)isr,
(cyg_DSR *)dsr );
xingzhe2001 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 taodm 的回复:]
消waring
[/Quote]
很有可能是这个。unused local variable warning
加载更多回复(8)

64,637

社区成员

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

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