VirtualBox

Changeset 79480 in vbox


Ignore:
Timestamp:
Jul 3, 2019 2:18:47 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
131744
Message:

iprt/mem.h: Added macro for generic new+delete implementation and extended the existing RTMEMEF_NEW_AND_DELETE_OPERATORS variation with placement variants.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/iprt/mem.h

    r78334 r79480  
    563563
    564564
     565/** @def RTMEM_IMPLEMENT_NEW_AND_DELETE
     566 * Provides a new and delete implementation to a class using IPRT's RTMem
     567 * allocator.
     568 */
     569#if !defined(RTMEM_WRAP_SOME_NEW_AND_DELETE_TO_EF) || defined(RTMEM_NO_WRAP_SOME_NEW_AND_DELETE_TO_EF)
     570# ifdef RT_EXCEPTIONS_ENABLED
     571#  define RTMEM_IMPLEMENT_NEW_AND_DELETE() \
     572        void *operator new(size_t cb) RT_THROW(std::bad_alloc) \
     573        { \
     574            void *pv = RTMemAlloc(cb); \
     575            if (RT_LIKELY(pv)) \
     576                return pv; \
     577            throw std::bad_alloc(); \
     578        } \
     579        void *operator new(size_t cb, const std::nothrow_t &nothrow_constant) RT_NO_THROW_DEF \
     580        { \
     581            NOREF(nothrow_constant); \
     582            return RTMemAlloc(cb); \
     583        } \
     584        void *operator new(size_t cb, void *pvBuf) RT_NO_THROW_DEF \
     585        { \
     586            NOREF(cb); \
     587            return pvBuf; \
     588        } \
     589        void *operator new[](size_t cb) RT_THROW(std::bad_alloc) \
     590        { \
     591            void *pv = RTMemAlloc(cb); \
     592            if (RT_LIKELY(pv)) \
     593                return pv; \
     594            throw std::bad_alloc(); \
     595        } \
     596        void *operator new[](size_t cb, const std::nothrow_t &nothrow_constant) RT_NO_THROW_DEF \
     597        { \
     598            NOREF(nothrow_constant); \
     599            return RTMemAlloc(cb); \
     600        } \
     601        \
     602        void operator delete(void *pv) RT_NO_THROW_DEF \
     603        { \
     604            RTMemFree(pv); \
     605        } \
     606        void operator delete(void *pv, const std::nothrow_t &nothrow_constant) RT_NO_THROW_DEF \
     607        { \
     608            NOREF(nothrow_constant); \
     609            RTMemFree(pv); \
     610        } \
     611        void operator delete[](void *pv) RT_NO_THROW_DEF \
     612        { \
     613            RTMemFree(pv); \
     614        } \
     615        void operator delete[](void *pv, const std::nothrow_t &nothrow_constant) RT_NO_THROW_DEF \
     616        { \
     617            NOREF(nothrow_constant); \
     618            RTMemFree(pv); \
     619        } \
     620        \
     621        typedef int UsingIprtNewAndDeleteOperators
     622# else  /* !RT_EXCEPTIONS_ENABLED */
     623#  define RTMEM_IMPLEMENT_NEW_AND_DELETE() \
     624        void *operator new(size_t cb) \
     625        { \
     626            return RTMemAlloc(cb); \
     627        } \
     628        void *operator new(size_t cb, const std::nothrow_t &nothrow_constant) \
     629        { \
     630            NOREF(nothrow_constant); \
     631            return RTMemAlloc(cb); \
     632        } \
     633        void *operator new(size_t cb, void *pvBuf) RT_NO_THROW_DEF \
     634        { \
     635            NOREF(cb); \
     636            return pvBuf; \
     637        } \
     638        void *operator new[](size_t cb) \
     639        { \
     640            return RTMemAlloc(cb); \
     641        } \
     642        void *operator new[](size_t cb, const std::nothrow_t &nothrow_constant) \
     643        { \
     644            NOREF(nothrow_constant); \
     645            return RTMemAlloc(cb); \
     646        } \
     647        \
     648        void operator delete(void *pv) \
     649        { \
     650            RTMemFree(pv); \
     651        } \
     652        void operator delete(void *pv, const std::nothrow_t &nothrow_constant) \
     653        { \
     654            NOREF(nothrow_constant); \
     655            RTMemFree(pv); \
     656        } \
     657        void operator delete[](void *pv) \
     658        { \
     659            RTMemFree(pv); \
     660        } \
     661        void operator delete[](void *pv, const std::nothrow_t &nothrow_constant) \
     662        { \
     663            NOREF(nothrow_constant); \
     664            RTMemFree(pv); \
     665        } \
     666        \
     667        typedef int UsingIprtNewAndDeleteOperators
     668# endif /* !RT_EXCEPTIONS_ENABLED */
     669#else  /* defined(RTMEM_WRAP_SOME_NEW_AND_DELETE_TO_EF) && !defined(RTMEM_NO_WRAP_SOME_NEW_AND_DELETE_TO_EF) */
     670# define RTMEM_IMPLEMENT_NEW_AND_DELETE() RTMEMEF_NEW_AND_DELETE_OPERATORS()
     671#endif /* defined(RTMEM_WRAP_SOME_NEW_AND_DELETE_TO_EF) && !defined(RTMEM_NO_WRAP_SOME_NEW_AND_DELETE_TO_EF) */
     672
     673
    565674#ifdef IN_RING0
    566675
     
    848957            return RTMemEfAlloc(cb, RTMEM_TAG, RT_SRC_POS); \
    849958        } \
     959        void *operator new(size_t cb, void *pvBuf) RT_NO_THROW_DEF \
     960        { \
     961            NOREF(cb); \
     962            return pvBuf; \
     963        } \
    850964        void *operator new[](size_t cb) RT_THROW(std::bad_alloc) \
    851965        { \
     
    8921006            return RTMemEfAlloc(cb, RTMEM_TAG, RT_SRC_POS); \
    8931007        } \
     1008        void *operator new(size_t cb, void *pvBuf) RT_NO_THROW_DEF \
     1009        { \
     1010            NOREF(cb); \
     1011            return pvBuf; \
     1012        } \
    8941013        void *operator new[](size_t cb) \
    8951014        { \
     
    9241043# endif
    9251044# define RTR0MEMEF_NEW_AND_DELETE_OPERATORS_IOKIT() \
    926     void *operator new(size_t cb) \
    927     { \
    928         return RTMemEfAllocZ(cb, RTMEM_TAG, RT_SRC_POS); \
    929     } \
    930     void *operator new[](size_t cb) \
    931     { \
    932         return RTMemEfAllocZ(cb, RTMEM_TAG, RT_SRC_POS); \
    933     } \
    934     \
    935     void operator delete(void *pv) \
    936     { \
    937         RTMemEfFree(pv, RT_SRC_POS); \
    938     } \
    939     void operator delete[](void *pv) \
    940     { \
    941         RTMemEfFree(pv, RT_SRC_POS); \
    942     } \
    943     \
    944     typedef int UsingElectricNewAndDeleteOperators
     1045        void *operator new(size_t cb) \
     1046        { \
     1047            return RTMemEfAllocZ(cb, RTMEM_TAG, RT_SRC_POS); \
     1048        } \
     1049        void *operator new[](size_t cb) \
     1050        { \
     1051            return RTMemEfAllocZ(cb, RTMEM_TAG, RT_SRC_POS); \
     1052        } \
     1053        \
     1054        void operator delete(void *pv) \
     1055        { \
     1056            RTMemEfFree(pv, RT_SRC_POS); \
     1057        } \
     1058        void operator delete[](void *pv) \
     1059        { \
     1060            RTMemEfFree(pv, RT_SRC_POS); \
     1061        } \
     1062        \
     1063        typedef int UsingElectricNewAndDeleteOperators
    9451064#else
    9461065# define RTMEMEF_NEW_AND_DELETE_OPERATORS() \
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette