老革命遇到新问题:new 操作符的问题

辉歌 2005-10-18 09:06:08
先看代码:


MyPacketControlDevice* m_pControlDevice;

m_pControlDevice = new (
sm_wszServiceName,
FILE_DEVICE_UNKNOWN,
sm_wszServiceName,
0,
DO_BUFFERED_IO
)
MyPacketControlDevice ();

我们平时用到的new操作符的使用方式是这样的:
(1)、int *p;

p=new int[10]; //分配一个含有10个整数的整形数组

delete[] p; //删除这个数组

(2)、int *p;

p=new int (100);//动态分配一个整数并初始化

但是我从没有看到过如上的代码。有人解释么?

...全文
339 21 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xzgyb 2005-10-20
w8u(晌马):
呵,客气了
  • 打赏
  • 举报
回复
辉歌 2005-10-20
再次感谢 xzgyb(老达摩) 的讲解。想想也应该这么样。

deping_chen(小平) 批评的对啊。老革命用老旧的知识闯了一关又一关就不思进取了,实在不该。 今后一定多向各位学习。
  • 打赏
  • 举报
回复
xzgyb 2005-10-20
syscoder:
static类型的变量的作用域虽然仅限于函数之内,也就是别的函数
看不到它,但它的生存期是与整个程序一样长

记得在学汇编时有数据段,代码段,堆栈段这些吧
static类型的变量就放在数据段

比如就这个例子中的buf,看一下汇编码
_DATA SEGMENT
COMM ?buf@?1???2A@@SAPAXIHHH@Z@4PADA:BYTE ; buf
_DATA ENDS

  • 打赏
  • 举报
回复
syscoder 2005-10-20
呵呵,涨知识了

to xzgyb(老达摩),我还有一个问题,
static void * operator new( size_t size, int a, int b, int c)
{
cout << "New ------ size: " << size
<< " a: " << a
<< " b: " << b
<< " c: " << c << endl;
static char buf[ 1 ];
return buf;
}
这个buf在程序中一直有效,但不是说static类型的函数内部变量的作用域仅限于函数之内吗?static类型的变量在物理上到底存储在计算机的什么地方呢?可能有点跑题了,呵呵
  • 打赏
  • 举报
回复
deping_chen 2005-10-20
很简单,operator new操作符重载,除了第一个参数必须是size_t类型,重载没有任何限制。
看来,老革命很少看书呀。
  • 打赏
  • 举报
回复
xzgyb 2005-10-20
w8u(晌马):不用客气
size_t是编译器传的,
比如这里
A * pa = new (1, 2, 3) A;
编译器会计算出A的大小,然后传入
在程序中调用new 定位操作符时new后面,只写上除size_t的其他参数
  • 打赏
  • 举报
回复
辉歌 2005-10-20
谢谢 xzgyb(老达摩) 的精彩示例。一个问题,size_t的参数什么时候传的?谁传的?我咋没看见?
  • 打赏
  • 举报
回复
xzgyb 2005-10-20
021850524(吸血鬼牌卫生巾):
不好意思,我可能没有写清楚
"保证new的第一个参数是size_t类型"是指重载new操作符时要保证第一个参数是size_t类型
调用new定位操作符,第一个参数要是个地址只不过是定位操作符的一种写法
如在vc中是在<new>中重载定位操作符

#ifndef __PLACEMENT_NEW_INLINE
#define __PLACEMENT_NEW_INLINE
inline void *__cdecl operator new(size_t, void *_P)
{return (_P); }
#if _MSC_VER >= 1200
inline void __cdecl operator delete(void *, void *)
{return; }
#endif
#endif


写了个代码:

#include <iostream>

using namespace std;

class A {
public:
A()
{
throw 1;
}

static void * operator new( size_t size, int a, int b, int c)
{
cout << "New ------ size: " << size
<< " a: " << a
<< " b: " << b
<< " c: " << c << endl;

static char buf[ 1 ];
return buf;
}


static void operator delete( void * ptr, int a, int b, int c)
{
cout << "Delete --- ptr: " << ptr
<< " a: " << a
<< " b: " << b
<< " c: " << c << endl;
}

};

int
main()
{
try
{
A * pa = new (1, 2, 3) A;
}
catch( ... )
{
}

return 0;
}

  • 打赏
  • 举报
回复
xlsue 2005-10-20
楼主的这种形式没见过。应该是重载了operator new了吧?
  • 打赏
  • 举报
回复
021850524 2005-10-20
>>这种写法只要保证new的第一个参数是size_t类型?
定位操作符第一个参数要保证是个地址吧?
  • 打赏
  • 举报
回复
syscoder 2005-10-20
嗯,明白了,多谢搂住和老达摩
  • 打赏
  • 举报
回复
辉歌 2005-10-19
to gamelearner(秋刀鱼)
:)
早就是老革命啦,你这代码中的例子与我列的问题可大不一样啊。
  • 打赏
  • 举报
回复
辉歌 2005-10-19
to llf_hust()
对不起,我没有说明白。我的意思是
m_pControlDevice = new (
sm_wszServiceName,
FILE_DEVICE_UNKNOWN,
sm_wszServiceName,
0,
DO_BUFFERED_IO
)
MyPacketControlDevice ();
这种语法没有见过。
============================
答案是:
这是new的定位操作符。
MyPacketControlDevice 类层次中重载了new操作符:


MyPacketControlDevice --|> KDevice

在KDevice中,有new的定位操作符

void* __cdecl KDevice::operator new(
size_t n,
PCWSTR DeviceName,
DEVICE_TYPE Type,
PCWSTR LinkName,
ULONG Characteristics,
ULONG DeviceFlags
)


  • 打赏
  • 举报
回复
gamelearner 2005-10-19
嗬嗬,看错了楼主的题目了,确实是定位操作符!
  • 打赏
  • 举报
回复
oosky2004 2005-10-19
首先想到就是重載了New()
  • 打赏
  • 举报
回复
KingI 2005-10-19
up
  • 打赏
  • 举报
回复
xzgyb 2005-10-19
new的定位操作符,
这种写法只要保证new的第一个参数是size_t类型,其他的参数可以随便
但client端调用时,必须与之相匹配

另外最好定义一个与之相对应的delete
当类的构照函数出现异常时,编译器会找到与这个new项对应的delete,去调用
  • 打赏
  • 举报
回复
sailor_Song 2005-10-19
没有看到过,顶了,学习学习
  • 打赏
  • 举报
回复
gamelearner 2005-10-18
动态分配一个类对象并初始化
class A
{
public:
A(int a, int b, int c){}
};

void main()
{
A *p = new A(1, 2, 3);
}
  • 打赏
  • 举报
回复
doway 2005-10-18
看上去象是放置语法,但括号里怎么那么多东西?!

char buf[20];

int main()
{
chaff *p;
p = new (buf) chaff;
...
}
  • 打赏
  • 举报
回复
加载更多回复(1)
相关推荐
发帖
C++ 语言

6.2w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2005-10-18 09:06
社区公告
暂无公告