Skip to content

Instantly share code, notes, and snippets.

@blockspacer
Created October 28, 2022 12:30
Show Gist options
  • Save blockspacer/3532359a5f1800542615201ae5ad7731 to your computer and use it in GitHub Desktop.
Save blockspacer/3532359a5f1800542615201ae5ad7731 to your computer and use it in GitHub Desktop.
C++ placement new example

About

https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEIADMXKQADqgKhE4MHt6%2B/ilpGQIhYZEsMXGJtpj2jgJCBEzEBNk%2Bfkl2mA6Z9Y0ExRHRsXoKDU0tue2jfaEDZUNcAJS2qF7EyOwc5vGhyN5YANQm8W5OI8SYrEfYJhoAgls7e5iHx2wsJACeVzf3ZtsMuy8ByObjOoWA3zuPzOXgc%2BwAYqhUIcAOwWQ53fZY/ahAgAKn2ySOABEGF5aLRkgRiEd0T9sQikRAFqj0ckXsT9mEAO44wQmACsFniguJJjRSQCIpRYvidJlGNuDIAfojUMzWfssPQCJhBVYBZyiXLCRyueTKdTaajOT9xbKrFC7rj9iwmKENeLHUrscgEI19lEvFR9ekAF6YVBUCAjdAgEBgowLUW0%2BnY2PxxPAAlnM08/ZQABuqDw6DxCwg5gAbEGqAsWRmE9TwRB4qR9mAOKpO8m5WmsWcALRXRtZ%2BPKrPM1OY9MEOMoFYEF5uEH7PG5kGr8xmQVuBjb6c%2Bgdz%2BNoLxLzfHAvF0vliC1/UaUUsy9uQ5mHcCvcHvtOo/7P0A1rT8LHDSNozVZNDUPBk1QJfhkRJLlMF5IsSzLCtq2A%2BtGXVXtvQZRszwvY5VwQ4d4mwIkhSfQ1lzIpEKKo/UuFFeir3Iq5qIsT9bVIq8Dy/fcPxg2d52I9i30bBBMFUSTr3Qu9gMfZ95ME78RN/f9OMotVxzVKctP7AD/WIQNgxFIUwKjCBIJTLTCJPBNTMwdAAH0qRpY41SufZox5NDb0wswawsnCDKWd8DQNYlbKReCXzRYysSoJjVSZfDjPtTKZ2PcTF3k1KuJUujXz8pjuNY0r%2BLfIrKO43i1JEoSfwIsTTwKsqIBvDD7wskriRfGr30/DSdwc7EqAAOnOJQCEM717Q4JZaE4AVeD8DgtFIVBOBXSxrH2BQVjWZ4th4UgCE0ZalgAaxASQBSmgAOeI3vej73qrfROEkDbrp2zheAUEANEu66ljgWAYEQBcWGSOhYnISg0HhxG4l2QxgDc6kvAYW7SCwQs8HWAA1PAUIAeWSRhOAumhaF1YgQfvAGolCRoPgB1G2EESmGFoLmtt4LA3SMcRhcJvBzi6QtMBByXZM6c8Nm23FqgB2g8CiYhOY8LAAebFg6eWvgDGABRyapmnNvp2QRDEdgpBkQRFBUdRJd0JIDCMFBrGsfRtZByAllQKlMgVwcqAUQwMgjEkmHQdBZoUfYo4YVBB1QFhCCj3W2EHVJ1bMwdgGB6pOlqPwIFccY2kCBh0H6Upyj0VJ0iruu24KKvm8GOJ2grro6imLvB5qbopj7uYB9sUfPFaYYp5mFv5iWY7VnWCQVrW/7Jd2jh9lUZ6q0HKtJAAn3gALXH8ZZCBcEIEh30SBZeCu4X61Ie63qmz7/6%2Bj9Dgf1SDGwFGDTa20D7A1BuDT%2BpAoaw0XMkc8yMa74CIMQUseh%2BCCAduIZ2uD5BKDUADL2pBuS62SCbHeHB1qkEgbwA%2BlNzwoKXFGI%2BJ8z4X0xkYG%2BxA8a3Xvh4NG9AzLnTfnArQX8ZKJyGMyIBICwEQIBtA2wsCP7SLuv4FEU0NCvQAR9b6q0ODxD3lAoGUjTaIJsUgVGCMxFoPsejEAFtmDJAUAgVABBCaYGJmTCm3Jqa024LwBmTMWZRDZhzYgQtto80YAQfmgsAaiyxhLba%2BAZaODlgrbaStkAqwBurEx20tY6z1hgVW78sHG1CUsKg5tLaBOCbbMJ9tRAEOkEQt2pDPZ5Cvn7A6lhA5RGDgosOVdI7R1jo4eO8RiSJ2TvLVO6dM7Z1zlQfOmBC4lkELENOZcqgT2cDXRuY8G5NxXv3buHdMgXPboUBg09W7j0rpPXoFyOjDwYD0JoLz5hz0%2BQvCYQL/nXJntvZYm8na0PoYwwGh9j6n3PvsYAyBkD8MEffR%2BmCX6LHfhDJYsisBxAUfdMwuj9GGKMYo3gyiGGqMsSDMGmjrEwwgEgZBqCKAQGcWI8IrANjIu4WijFWK768Fck/LBcYkhEPwU7bpsheke22roAIlCmDUPqUA%2BFTKOAsIIGw/YHCRWovRZiiAt8hEFhEQ4g5WwzCSLZTIi4pLKC0KUSAcBjL97Mo0US7%2BOi9EGJpfEYxnAzF%2BosRwQln9aFmHMUwyxrqlhy2ZpkB6QA

Normally, an object is created using new, and destroyed when you call delete on the object. However, because 'delete' will also try to free the underlying memory back to the heap, you should never call delete on an object which which was instantiated using placement new.

Nevertheless, (no matter how it was allocated) every object ought to be destroyed (because its destructor might do something important).

Therefore instead of the object's being destroyed using delete, you have to destroy the object yourself, and do so explicitly, by invoking its destructor as shown in the FAQ you cited.

#include <iostream>
#include <memory>
#include <string>
struct Foo {
int* p=nullptr;
Foo() { p = new int[3]{1,2,3}; }
~Foo() { delete[] p; p = nullptr; }
};
int main() {
char buf[sizeof(std::string)];
std::string* str = new ((void*)(&buf)) std::string(3, 'x');
str->std::string::~string();
std::cout << *str << "\n";
std::cout << (void*)(buf[0]) << "\n";
char buf2[sizeof(Foo)];
Foo* foo = new ((void*)(&buf2)) Foo();
std::cout << foo->p[0] << foo->p[1] << foo->p[2] << "\n";
std::cout << std::hex << (void*)(buf2[0]) << "\n";
foo->Foo::~Foo();
char buf3[sizeof(Foo)];
std::shared_ptr<Foo> f(new((void*)(&buf3)) Foo(), +[](Foo* f) {
f->~Foo();
});
std::cout << f->p[0] << f->p[1] << f->p[2] << "\n";
std::cout << (void*)(buf3[0]) << "\n";
f.reset();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment