如何通过宏重新定义操作符删除/删除[]? [英] How to redefine operator delete/delete[] via macro?

查看:86
本文介绍了如何通过宏重新定义操作符删除/删除[]?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,

我们正在为内存有限的PDA开发C ++应用程序,

所以我们想自己做内存管理---前 - 分配一个大的
块并覆盖new和delete来调用我们的API。


这个棘手的事情只需重新定义operator new并删除因为
我们需要在我们的应用程序中链接的
OS(PDA平台OS)库

为某种目的重新定义了operator new / delete。只需重新定义

new / delete,因为我们得到多个

定义的错误,因为我们必须链接到的OS库:


inline void * operator new(size_t size)

{return MyMalloc(size); }

inline void * operator new [](size_t size)

{return MyMalloc(size); }

inline void operator delete(void * p)

{MyFree(p); }

inline void operator delete [](void * p)

{MyFree(p); }


因此我们必须使用以下方法:


enum EMyNewType {EMyNew};

inline void * operator new(size_t size,

EMyNewType t)

{return MyMalloc(size); }


inline void * operator new [](size_t size,

EMyNewType t)

{return MyMalloc(size); }


inline void operator delete(void * p,

EMyNewType t)

{MyFree(p); }


inline void operator delete [](void * p,

EMyNewType t)

{MyFree(p); }


#define THENEW new(EMyNew)

#define new THENEW

#define THEDELETE delete(EMyNew)

#define删除THEDELETE


但是,上述解决方法仅适用于新,我编译错误

代码如此作为 delete [] m_s; ,似乎编译器不认识

我们重新定义了delete []。但是代码没有问题,例如

" new char [10];"你碰巧知道为什么吗?


感谢您的任何反馈!

Hello,

We are developing C++ appplications for PDAs where memory is limited,
so we want to do memory management by ourselves --- pre-allocated a big
chunk and overwrite new and delete to call our APIs.

The tricky thing simply redefine operator new and delete because the
OS(PDA platform OS)library we need to link with in our application also
redefined operator new/delete for some purpose. Simply redefine
new/delete as following won''t work as we get errors of "multiple
definition", which comes from the OS library we have to link to:

inline void* operator new(size_t size )
{ return MyMalloc( size ); }
inline void* operator new[]( size_t size )
{ return MyMalloc( size ); }
inline void operator delete(void* p )
{ MyFree( p ); }
inline void operator delete[]( void* p )
{ MyFree( p ); }

So we have to use a work around as following:

enum EMyNewType { EMyNew };
inline void* operator new( size_t size,
EMyNewType t)
{ return MyMalloc( size ); }

inline void* operator new[]( size_t size,
EMyNewType t)
{ return MyMalloc( size ); }

inline void operator delete( void* p,
EMyNewType t)
{ MyFree( p ); }

inline void operator delete[]( void* p,
EMyNewType t)
{ MyFree( p ); }

#define THENEW new (EMyNew)
#define new THENEW
#define THEDELETE delete (EMyNew)
#define delete THEDELETE

However, above work-around only works for "new", I got compiling errors
on code such as " delete []m_s; ", seems the compiler doesn''t recognize
the delete[] we redefined. But there is no problem with code such as
"new char[10];" Do you happen to know why?

Thanks for any feedback!

推荐答案

假设你正在使用c ++(因为你在这篇文章中发帖),我的建议是:不要使用MACROS。使用c ++功能重载

运算符实现你所需要的。


2005年2月21日22:56:12 -0800,Amy< am ****** @ yahoo.com>写道:
supposing that you''re using c++ (because of your posting in this ng), my
advice is: DO NOT USE MACROS. use the c++ feature "overloading of
operators" to achieve what you need.

On 21 Feb 2005 22:56:12 -0800, Amy <am******@yahoo.com> wrote:
你好,

我们正在为内存有限的PDA开发C ++应用程序,所以我们想自己做内存管理 - - 预先分配一个大块并覆盖新的和删除来调用我们的API。

这个棘手的事情只是重新定义operator new和delete因为
OS(PDA平台OS) )库我们需要在我们的应用程序中链接
重新定义operator new / delete用于某些目的。只需重新定义
new / delete,因为我们得到多个
定义的错误,因为我们必须链接到的OS库中出现以下错误:
inline void * operator new(size_t size)
{return MyMalloc(size); }
内联void * operator new [](size_t size)
{return MyMalloc(size); }
内联void operator delete(void * p)
{MyFree(p); }
内联void operator delete [](void * p)
{MyFree(p); }

所以我们必须使用如下工作:

枚举EMyNewType {EMyNew};
内联void * operator new(size_t size,
EMyNewType t)
{return MyMalloc(size); }

内联void * operator new [](size_t size,
EMyNewType t)
{return MyMalloc(size);内联void operator delete(void * p,
EMyNewType t)
{MyFree(p);内联void operator delete [](void * p,
EMyNewType t)
{MyFree(p); }

#define THENEW new(EMyNew)
#define new THENEW
#define THEDELETE删除(EMyNew)
#define删除THEDELETE
但是,上述解决方法仅适用于新,我在代码上编译错误
,例如 delete [] m_s; ,似乎编译器不认识
我们重新定义的删除[]。但是代码没有问题,例如
new char [10];你碰巧知道为什么吗?

感谢您的反馈!
Hello,

We are developing C++ appplications for PDAs where memory is limited,
so we want to do memory management by ourselves --- pre-allocated a big
chunk and overwrite new and delete to call our APIs.

The tricky thing simply redefine operator new and delete because the
OS(PDA platform OS)library we need to link with in our application also
redefined operator new/delete for some purpose. Simply redefine
new/delete as following won''t work as we get errors of "multiple
definition", which comes from the OS library we have to link to:

inline void* operator new(size_t size )
{ return MyMalloc( size ); }
inline void* operator new[]( size_t size )
{ return MyMalloc( size ); }
inline void operator delete(void* p )
{ MyFree( p ); }
inline void operator delete[]( void* p )
{ MyFree( p ); }

So we have to use a work around as following:

enum EMyNewType { EMyNew };
inline void* operator new( size_t size,
EMyNewType t)
{ return MyMalloc( size ); }

inline void* operator new[]( size_t size,
EMyNewType t)
{ return MyMalloc( size ); }

inline void operator delete( void* p,
EMyNewType t)
{ MyFree( p ); }

inline void operator delete[]( void* p,
EMyNewType t)
{ MyFree( p ); }

#define THENEW new (EMyNew)
#define new THENEW
#define THEDELETE delete (EMyNew)
#define delete THEDELETE

However, above work-around only works for "new", I got compiling errors
on code such as " delete []m_s; ", seems the compiler doesn''t recognize
the delete[] we redefined. But there is no problem with code such as
"new char[10];" Do you happen to know why?

Thanks for any feedback!




-

使用Opera''革命性的电子邮件客户端: http://www.opera.com/m2/


Amy写道:
#define THENEW new(EMyNew)
#define new THENEW
#define THEDELETE删除(EMyNew)
#define删除THEDELETE

但是,上面的解决方法仅适用于new,我在代码上编译
错误,例如 delete [] m_s; ,似乎编译器没有
识别我们重新定义的删除[]。但是代码没有问题,例如
new char [10];你碰巧知道为什么吗?
#define THENEW new (EMyNew)
#define new THENEW
#define THEDELETE delete (EMyNew)
#define delete THEDELETE

However, above work-around only works for "new", I got compiling errors on code such as " delete []m_s; ", seems the compiler doesn''t recognize the delete[] we redefined. But there is no problem with code such as
"new char[10];" Do you happen to know why?




''operator delete()''没有放置符号:如果你打电话给

a放置形式的新形式(除了''std :: nothrow''形式)你需要明确销毁你的对象并直接调用''operator delete()''

。就个人而言,我也不会定义关键字,至少

由于两个原因:

- 标准没有规定允许定义更改

意思是关键字。

- 改变已知语义变成不同的东西总是

有问题。

我会使用相应的相应包装功能,例如在

中分配器对象的形式。

-

< mailto:di *********** @ yahoo.com> < http://www.dietmar-kuehl.de/>

< http://www.contendix.com> - 软件开发&咨询



There is no placement notation for ''operator delete()'': if you call
a placement form of "new" (other than the ''std::nothrow'' form) you
need to explicitly destroy your object and call ''operator delete()''
directly. Personally, I would also not define the keywords, at least
due to two reasons:
- The standard makes no provision allowing defines to change the
meaning of keywords.
- Changing known semantics to become something different is always
problematic.
I would use an appropriate wrapping of respective functions, e.g. in
the form of an allocator object.
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting


" ulrich" < UA ******** @ aon.at>在消息中写道

news:opsmlarj06n2mgp5 @ innsbruck-neu ...
"ulrich" <ua********@aon.at> wrote in message
news:opsmlarj06n2mgp5@innsbruck-neu...
假设你正在使用c ++(因为你在这个ng中发帖),我的
建议是:不要使用MACROS。使用c ++功能重载
运算符实现您的需求。
supposing that you''re using c++ (because of your posting in this ng), my
advice is: DO NOT USE MACROS. use the c++ feature "overloading of
operators" to achieve what you need.




您是否读过他的问题?



Did you even read his question?


这篇关于如何通过宏重新定义操作符删除/删除[]?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆