...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <cassert> #include <cstddef> #if __clang__ || __GNUG__ const size_t overhead = sizeof(size_t); #else const size_t overhead = 2 * sizeof(size_t); #endif struct S { void *p; S (); ~S (); }; void* operator new[] (size_t n, void *p, size_t bufsize) { assert (n <= bufsize); // alternatively, throw an exception return p; } void f() { const size_t n = 32; alignas(S) unsigned char buffer[sizeof(S) * n + overhead]; S *sp = new (buffer, sizeof buffer) S[n]; // ... // Destroy elements of the array. for (size_t i = 0; i != n; ++i) { sp[i].~S (); } } |
Risk Assessment
Passing improperly aligned pointers or pointers to insufficient storage to placement new
expressions can result in undefined behavior, including buffer overflow and abnormal termination.
...