Scippy

SoPlex

Sequential object-oriented simPlex

spxalloc.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the class library */
4 /* SoPlex --- the Sequential object-oriented simPlex. */
5 /* */
6 /* Copyright (C) 1996-2022 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SoPlex is distributed under the terms of the ZIB Academic Licence. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SoPlex; see the file COPYING. If not email to soplex@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file spxalloc.h
17  * @brief Memory allocation routines.
18  */
19 #ifndef _SPXALLOC_H_
20 #define _SPXALLOC_H_
21 
22 #include <iostream>
23 #include <stdlib.h>
24 #include <assert.h>
25 
26 #include "soplex/spxdefines.h"
27 #include "soplex/spxout.h"
28 
29 #include "soplex/exceptions.h"
30 
31 namespace soplex
32 {
33 /**@name Memory allocation routines
34  * @ingroup Elementary
35  * Here we have cover functions for malloc/realloc/free, to make sure
36  * that we allays succeed. Otherwise an exception is thrown.
37  *
38  * We use templates to get the types right, otherwise casts would have
39  * been neccessary.
40  */
41 ///@{
42 /**@brief Allocate memory.
43  * @param p some pointer
44  * @param n the number of elements \p p will point to.
45  * @throw SPxMemoryException if memory could not be allocated.
46  */
47 
48 template <class T>
49 inline void spx_alloc(T& p, int n = 1)
50 {
51  assert(p == 0);
52  assert(n >= 0);
53 
54  if(n == 0)
55  n = 1;
56 
57  try
58  {
59  p = reinterpret_cast<T>(malloc(sizeof(*p) * (unsigned int) n));
60  }
61  catch(const std::bad_alloc&)
62  {
63  throw(SPxMemoryException("Error allocating memory"));
64  }
65 
66  if(nullptr == p)
67  {
68  std::cerr << "EMALLC01 malloc: Out of memory - cannot allocate "
69  << sizeof(*p) * (unsigned int) n << " bytes" << std::endl; // coverity[suspicious_sizeof]
70  throw(SPxMemoryException("XMALLC01 malloc: Could not allocate enough memory"));
71  }
72 }
73 
74 /**@brief Change amount of allocated memory.
75  * @param p some pointer
76  * @param n the number of elements p should point to.
77  * @throw SPxMemoryException if memory could not be allocated.
78  */
79 template <class T>
80 inline void spx_realloc(T& p, int n)
81 {
82  assert(n >= 0);
83 
84  /* new pointer to not lose old one in case of problems */
85  T pp;
86 
87  if(n == 0)
88  n = 1;
89 
90  try
91  {
92  pp = reinterpret_cast<T>(realloc(p, sizeof(*p) * (unsigned int) n));
93  }
94  catch(const std::bad_alloc&)
95  {
96  throw(SPxMemoryException("Error reallocating memory"));
97  }
98 
99  if(0 == pp)
100  {
101  std::cerr << "EMALLC02 realloc: Out of memory - cannot allocate "
102  << sizeof(*p) * (unsigned int) n << " bytes" << std::endl;
103  throw(SPxMemoryException("XMALLC02 realloc: Could not allocate enough memory"));
104  }
105 
106  p = pp;
107 }
108 
109 /// Release memory
110 template <class T>
111 inline void spx_free(T& p)
112 {
113  assert(p != 0);
114  free(p);
115 
116  p = 0;
117 }
118 
119 ///@}
120 } // namespace soplex
121 
122 
123 #endif // _SPXALLOC_H_
Exception classes for SoPlex.
Wrapper for different output streams and verbosity levels.
Exception class for out of memory exceptions.This class is derived from the SoPlex exception base cla...
Definition: exceptions.h:70
void spx_alloc(T &p, int n=1)
Allocate memory.
Definition: spxalloc.h:49
Debugging, floating point type and parameter definitions.
void spx_realloc(T &p, int n)
Change amount of allocated memory.
Definition: spxalloc.h:80
Everything should be within this namespace.
void spx_free(T &p)
Release memory.
Definition: spxalloc.h:111