+// See
+// https://en.cppreference.com/w/cpp/memory/new/operator_new
+// and
+// https://en.cppreference.com/w/cpp/memory/new/operator_delete
+
+// Some of these are only used in very special circumstances
+// so rather then using new and delete expressions most calls
+// here directly call the operators
+
#include <cstdlib>
#include <new>
#include <iostream>
};
int main() {
- // unsized versions
- MyClass* myClass = new MyClass;
+ // THROWING
+ // plain versions
+ // cppreference new number 1
+ OrdinaryClass* oClass = new OrdinaryClass();
+ // cppreference delete number 1
+ operator delete(oClass);
+
+ // cppreference new number 2
+ OrdinaryClass* oClass5 = new OrdinaryClass[5];
+ // cppreference delete number 2
+ operator delete[](oClass5);
+
+ // aligned versions
+ // cppreference new number 3
+ MyClass* myClass = new MyClass();
+ // cppreference delete number 3
operator delete(myClass, std::align_val_t(64U));
+ // cppreference new number 4
MyClass* myClass5 = new MyClass[5];
- operator delete [](myClass5, std::align_val_t(64U));
+ // cppreference delete number 4
+ operator delete[](myClass5, std::align_val_t(64U));
// sized versions
+ oClass = new OrdinaryClass();
+ // cppreference delete number 5
+ operator delete(oClass, sizeof(OrdinaryClass));
+
+ oClass5 = new OrdinaryClass[5];
+ // cppreference delete number 6
+ operator delete[](oClass5, sizeof(OrdinaryClass)*5);
+
+ // sized aligned versions
myClass = new MyClass();
- operator delete(myClass, 64U, std::align_val_t(64U));
+ // cppreference delete number 7
+ operator delete(myClass, sizeof(*myClass), std::align_val_t(64U));
myClass5 = new MyClass[5];
- operator delete [](myClass5, 320U, std::align_val_t(64U));
+ // cppreference delete number 8
+ operator delete [](myClass5, sizeof(*myClass)*5, std::align_val_t(64U));
- MyClass* myClassNt = new (std::nothrow) MyClass;
- operator delete(myClassNt, std::align_val_t(64U));
+ // NOTHROW
- MyClass* myClass5Nt = new (std::nothrow) MyClass[5];
- operator delete [](myClass5Nt, std::align_val_t(64U));
+ // cppreference new number 5
+ oClass = new (std::nothrow) OrdinaryClass;
+ delete oClass;
- myClassNt = new (std::nothrow) MyClass;
- operator delete(myClassNt, sizeof(MyClass), std::align_val_t(64U));
+ // cppreference new number 6
+ oClass5 = new (std::nothrow) OrdinaryClass[5];
+ delete [] oClass5;
- myClass5Nt = new (std::nothrow) MyClass[5];
- operator delete [](myClass5Nt, sizeof(MyClass)*5, std::align_val_t(64U));
+ // cppreference new number 7
+ myClass = new (std::nothrow) MyClass;
+ delete myClass;
- OrdinaryClass* oClass = new OrdinaryClass;
- // this is a limitation, VG does not use enough bits
- // to tell apart aligned and unaligned allocations
- // so new/aligned delete is not a mismatch
- operator delete(oClass, std::align_val_t(64U));
- oClass = new (std::nothrow) OrdinaryClass;
- //delete oClass;
- // changed the above delete because GCC generates
- // a sized delete (???) whilst clang generates an ordinary delete
- operator delete(oClass);
- oClass = new OrdinaryClass[5];
- delete [] oClass;
- oClass = new (std::nothrow) OrdinaryClass[5];
- delete [] oClass;
+ // cppreference new number 8
+ myClass5 = new (std::nothrow) MyClass[5];
+ delete [] myClass5;
}
+
+_Znwm(4) = 0x........
+_ZdlPv(0x........)
+_Znam(20) = 0x........
+_ZdaPv(0x........)
_ZnwmSt11align_val_t(size 64, al 64) = 0x........
_ZdlPvSt11align_val_t(0x........)
_ZnamSt11align_val_t(size 320, al 64) = 0x........
_ZdaPvSt11align_val_t(0x........)
+_Znwm(4) = 0x........
+_ZdlPvm(0x........)
+_Znam(20) = 0x........
+_ZdaPvm(0x........)
_ZnwmSt11align_val_t(size 64, al 64) = 0x........
_ZdlPvmSt11align_val_t(0x........)
_ZnamSt11align_val_t(size 320, al 64) = 0x........
_ZdaPvmSt11align_val_t(0x........)
-_ZnwmSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........
-_ZdlPvSt11align_val_t(0x........)
-_ZnamSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........
-_ZdaPvSt11align_val_t(0x........)
-_ZnwmSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........
-_ZdlPvmSt11align_val_t(0x........)
-_ZnamSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........
-_ZdaPvmSt11align_val_t(0x........)
-_Znwm(4) = 0x........
-_ZdlPvSt11align_val_t(0x........)
_ZnwmRKSt9nothrow_t(4) = 0x........
-_ZdlPv(0x........)
-_Znam(20) = 0x........
-_ZdaPv(0x........)
+_ZdlPvm(0x........)
_ZnamRKSt9nothrow_t(20) = 0x........
_ZdaPv(0x........)
+_ZnwmSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........
+_ZdlPvmSt11align_val_t(0x........)
+_ZnamSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........
+_ZdaPvSt11align_val_t(0x........)
HEAP SUMMARY:
in use at exit: ... bytes in ... blocks
-_Znwj(64) = 0x........
-_ZdlPvSt11align_val_t(0x........)
-_Znaj(320) = 0x........
-_ZdaPvSt11align_val_t(0x........)
-_Znwj(64) = 0x........
-_ZdlPvjSt11align_val_t(0x........)
-_Znaj(320) = 0x........
-_ZdaPvjSt11align_val_t(0x........)
-_ZnwjRKSt9nothrow_t(64) = 0x........
+_Znwj(4) = 0x........
+_ZdlPv(0x........)
+_Znaj(20) = 0x........
+_ZdaPv(0x........)
+_ZnwjSt11align_val_t(size 64, al 64) = 0x........
_ZdlPvSt11align_val_t(0x........)
-_ZnajRKSt9nothrow_t(320) = 0x........
+_ZnajSt11align_val_t(size 320, al 64) = 0x........
_ZdaPvSt11align_val_t(0x........)
-_ZnwjRKSt9nothrow_t(64) = 0x........
+_Znwj(4) = 0x........
+_ZdlPvj(0x........)
+_Znaj(20) = 0x........
+_ZdaPvj(0x........)
+_ZnwjSt11align_val_t(size 64, al 64) = 0x........
_ZdlPvjSt11align_val_t(0x........)
-_ZnajRKSt9nothrow_t(320) = 0x........
+_ZnajSt11align_val_t(size 320, al 64) = 0x........
_ZdaPvjSt11align_val_t(0x........)
-_Znwj(4) = 0x........
-_ZdlPvSt11align_val_t(0x........)
_ZnwjRKSt9nothrow_t(4) = 0x........
-_ZdlPv(0x........)
-_Znaj(20) = 0x........
-_ZdaPv(0x........)
+_ZdlPvj(0x........)
_ZnajRKSt9nothrow_t(20) = 0x........
_ZdaPv(0x........)
+_ZnwjSt11align_val_tRKSt9nothrow_t(size 64, al 64) = 0x........
+_ZdlPvjSt11align_val_t(0x........)
+_ZnajSt11align_val_tRKSt9nothrow_t(size 320, al 64) = 0x........
+_ZdaPvSt11align_val_t(0x........)
HEAP SUMMARY:
in use at exit: ... bytes in ... blocks