/src/icu/source/common/uobject.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // © 2016 and later: Unicode, Inc. and others. |
2 | | // License & terms of use: http://www.unicode.org/copyright.html |
3 | | /* |
4 | | ****************************************************************************** |
5 | | * |
6 | | * Copyright (C) 2002-2012, International Business Machines |
7 | | * Corporation and others. All Rights Reserved. |
8 | | * |
9 | | ****************************************************************************** |
10 | | * file name: uobject.h |
11 | | * encoding: UTF-8 |
12 | | * tab size: 8 (not used) |
13 | | * indentation:4 |
14 | | * |
15 | | * created on: 2002jun26 |
16 | | * created by: Markus W. Scherer |
17 | | */ |
18 | | |
19 | | #include "unicode/uobject.h" |
20 | | #include "cmemory.h" |
21 | | |
22 | | U_NAMESPACE_BEGIN |
23 | | |
24 | | #if U_OVERRIDE_CXX_ALLOCATION |
25 | | |
26 | | /* |
27 | | * Default implementation of UMemory::new/delete |
28 | | * using uprv_malloc() and uprv_free(). |
29 | | * |
30 | | * For testing, this is used together with a list of imported symbols to verify |
31 | | * that ICU is not using the global ::new and ::delete operators. |
32 | | * |
33 | | * These operators can be implemented like this or any other appropriate way |
34 | | * when customizing ICU for certain environments. |
35 | | * Whenever ICU is customized in binary incompatible ways please be sure |
36 | | * to use library name suffixes to distinguish such libraries from |
37 | | * the standard build. |
38 | | * |
39 | | * Instead of just modifying these C++ new/delete operators, it is usually best |
40 | | * to modify the uprv_malloc()/uprv_free()/uprv_realloc() functions in cmemory.c. |
41 | | * |
42 | | * Memory test on Windows/MSVC 6: |
43 | | * The global operators new and delete look as follows: |
44 | | * 04F 00000000 UNDEF notype () External | ??2@YAPAXI@Z (void * __cdecl operator new(unsigned int)) |
45 | | * 03F 00000000 UNDEF notype () External | ??3@YAXPAX@Z (void __cdecl operator delete(void *)) |
46 | | * |
47 | | * These lines are from output generated by the MSVC 6 tool dumpbin with |
48 | | * dumpbin /symbols *.obj |
49 | | * |
50 | | * ??2@YAPAXI@Z and ??3@YAXPAX@Z are the linker symbols in the .obj |
51 | | * files and are imported from msvcrtd.dll (in a debug build). |
52 | | * |
53 | | * Make sure that with the UMemory operators new and delete defined these two symbols |
54 | | * do not appear in the dumpbin /symbols output for the ICU libraries! |
55 | | * |
56 | | * If such a symbol appears in the output then look in the preceding lines in the output |
57 | | * for which file and function calls the global new or delete operator, |
58 | | * and replace with uprv_malloc/uprv_free. |
59 | | */ |
60 | | |
61 | 0 | void * U_EXPORT2 UMemory::operator new(size_t size) U_NOEXCEPT { |
62 | 0 | return uprv_malloc(size); |
63 | 0 | } |
64 | | |
65 | 0 | void U_EXPORT2 UMemory::operator delete(void *p) U_NOEXCEPT { |
66 | 0 | if(p!=NULL) { |
67 | 0 | uprv_free(p); |
68 | 0 | } |
69 | 0 | } |
70 | | |
71 | 0 | void * U_EXPORT2 UMemory::operator new[](size_t size) U_NOEXCEPT { |
72 | 0 | return uprv_malloc(size); |
73 | 0 | } |
74 | | |
75 | 0 | void U_EXPORT2 UMemory::operator delete[](void *p) U_NOEXCEPT { |
76 | 0 | if(p!=NULL) { |
77 | 0 | uprv_free(p); |
78 | 0 | } |
79 | 0 | } |
80 | | |
81 | | #if U_HAVE_DEBUG_LOCATION_NEW |
82 | | void * U_EXPORT2 UMemory::operator new(size_t size, const char* /*file*/, int /*line*/) U_NOEXCEPT { |
83 | | return UMemory::operator new(size); |
84 | | } |
85 | | |
86 | | void U_EXPORT2 UMemory::operator delete(void* p, const char* /*file*/, int /*line*/) U_NOEXCEPT { |
87 | | UMemory::operator delete(p); |
88 | | } |
89 | | #endif /* U_HAVE_DEBUG_LOCATION_NEW */ |
90 | | |
91 | | |
92 | | #endif |
93 | | |
94 | 0 | UObject::~UObject() {} |
95 | | |
96 | 0 | UClassID UObject::getDynamicClassID() const { return NULL; } |
97 | | |
98 | | U_NAMESPACE_END |
99 | | |
100 | | U_NAMESPACE_USE |
101 | | |
102 | | U_CAPI void U_EXPORT2 |
103 | 0 | uprv_deleteUObject(void *obj) { |
104 | 0 | delete static_cast<UObject *>(obj); |
105 | 0 | } |