#include <iostream>
#include <memory>
#include <cstdlib>
#include <functional>
#include <new>
bool memory_verbose = false;
void *operator new(std::size_t size)
{
auto ptr = std::malloc(size);
if (memory_verbose)
std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
return ptr;
}
void *operator new(std::size_t size, const std::nothrow_t&)
{
auto ptr = std::malloc(size);
if (memory_verbose)
std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
return ptr;
}
/*
void *operator new[](std::size_t size)
{
auto ptr = std::malloc(size);
if (memory_verbose)
std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
return ptr;
}
void *operator new[](std::size_t size, const std::nothrow_t&)
{
auto ptr = std::malloc(size);
if (memory_verbose)
std::cout << __PRETTY_FUNCTION__ << ":" << size << ":" << ptr << std::endl;
return ptr;
}
*/
void operator delete(void* ptr) noexcept
{
if (memory_verbose)
std::cout << __PRETTY_FUNCTION__ << ":" << ptr << std::endl;
return std::free(ptr);
}
/*
void operator delete[](void* ptr) noexcept
{
if (memory_verbose)
std::cout << __PRETTY_FUNCTION__ << ":" << ptr << std::endl;
return std::free(ptr);
}
*/
struct FlagGuard
{
public:
FlagGuard(bool& flag, bool newValue = true) : flagRef(flag), flagBack(flag) { flag = newValue; }
~FlagGuard() { flagRef = flagBack; }
private:
bool& flagRef;
bool flagBack;
};
int main()
{
std::cout << sizeof(std::function<void(std::ostream&)>) << std::endl;
std::cout << sizeof(void(*)(std::ostream&)) << std::endl;
{
FlagGuard fg(memory_verbose);
auto p = new(std::nothrow) char[100];
delete [] p;
}
{
FlagGuard fg(memory_verbose);
std::function<void(std::ostream&)> l1 = [](std::ostream& os) { os << "No capture\n"; };
l1(std::cout);
}
{
FlagGuard fg(memory_verbose);
int a = 7;
std::function<void(std::ostream&)> l1 = [a](std::ostream& os) { os << "Capture[a=" << a << "]\n"; };
std::cout << sizeof(a) << std::endl;
l1(std::cout);
}
{
FlagGuard fg(memory_verbose);
struct VLS
{
char bs[200] = "Very, very, , very, very, very, very, very, very, very, very, very, very, very, very, very, very, very long string";
};
VLS vls;
std::function<void(std::ostream&)> l1 = [vls](std::ostream& os) { os << "Capture[vls=" << vls.bs << "]\n"; };
l1(std::cout);
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxuZXc+Cgpib29sIG1lbW9yeV92ZXJib3NlID0gZmFsc2U7CnZvaWQgKm9wZXJhdG9yIG5ldyhzdGQ6OnNpemVfdCBzaXplKQp7CiAgICBhdXRvIHB0ciA9IHN0ZDo6bWFsbG9jKHNpemUpOwogICAgaWYgKG1lbW9yeV92ZXJib3NlKQogICAgICAgIHN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IiA8PCBzaXplIDw8ICI6IiA8PCBwdHIgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIHB0cjsKfQoKdm9pZCAqb3BlcmF0b3IgbmV3KHN0ZDo6c2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6bm90aHJvd190JikKewogICAgYXV0byBwdHIgPSBzdGQ6Om1hbGxvYyhzaXplKTsKICAgIGlmIChtZW1vcnlfdmVyYm9zZSkKICAgICAgICBzdGQ6OmNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiIgPDwgc2l6ZSA8PCAiOiIgPDwgcHRyIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiBwdHI7Cn0KLyoKdm9pZCAqb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3Qgc2l6ZSkKewogICAgYXV0byBwdHIgPSBzdGQ6Om1hbGxvYyhzaXplKTsKICAgIGlmIChtZW1vcnlfdmVyYm9zZSkKICAgICAgICBzdGQ6OmNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiIgPDwgc2l6ZSA8PCAiOiIgPDwgcHRyIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiBwdHI7Cn0Kdm9pZCAqb3BlcmF0b3IgbmV3W10oc3RkOjpzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpub3Rocm93X3QmKQp7CiAgICBhdXRvIHB0ciA9IHN0ZDo6bWFsbG9jKHNpemUpOwogICAgaWYgKG1lbW9yeV92ZXJib3NlKQogICAgICAgIHN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IiA8PCBzaXplIDw8ICI6IiA8PCBwdHIgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIHB0cjsKfQoqLwp2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIpIG5vZXhjZXB0CnsKICAgIGlmIChtZW1vcnlfdmVyYm9zZSkKICAgICAgICBzdGQ6OmNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAiOiIgPDwgcHRyIDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiBzdGQ6OmZyZWUocHRyKTsKfQovKgp2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqIHB0cikgbm9leGNlcHQKewogICAgaWYgKG1lbW9yeV92ZXJib3NlKQogICAgICAgIHN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICI6IiA8PCBwdHIgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIHN0ZDo6ZnJlZShwdHIpOwp9CiovCgpzdHJ1Y3QgRmxhZ0d1YXJkCnsKcHVibGljOgogICAgRmxhZ0d1YXJkKGJvb2wmIGZsYWcsIGJvb2wgbmV3VmFsdWUgPSB0cnVlKSA6IGZsYWdSZWYoZmxhZyksIGZsYWdCYWNrKGZsYWcpIHsgZmxhZyA9IG5ld1ZhbHVlOyB9CiAgICB+RmxhZ0d1YXJkKCkgeyBmbGFnUmVmID0gZmxhZ0JhY2s7IH0KcHJpdmF0ZToKICAgIGJvb2wmIGZsYWdSZWY7CiAgICBib29sIGZsYWdCYWNrOwp9OwoKaW50IG1haW4oKQp7CiAgICBzdGQ6OmNvdXQgPDwgc2l6ZW9mKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om9zdHJlYW0mKT4pIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCBzaXplb2Yodm9pZCgqKShzdGQ6Om9zdHJlYW0mKSkgPDwgc3RkOjplbmRsOwogICAgewogICAgICAgIEZsYWdHdWFyZCBmZyhtZW1vcnlfdmVyYm9zZSk7CiAgICAgICAgYXV0byBwID0gbmV3KHN0ZDo6bm90aHJvdykgY2hhclsxMDBdOwogICAgICAgIGRlbGV0ZSBbXSBwOwogICAgfQogICAgewogICAgICAgIEZsYWdHdWFyZCBmZyhtZW1vcnlfdmVyYm9zZSk7CiAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6b3N0cmVhbSYpPiBsMSA9IFtdKHN0ZDo6b3N0cmVhbSYgb3MpIHsgb3MgPDwgIk5vIGNhcHR1cmVcbiI7IH07CiAgICAgICAgbDEoc3RkOjpjb3V0KTsKICAgIH0KICAgIHsKICAgICAgICBGbGFnR3VhcmQgZmcobWVtb3J5X3ZlcmJvc2UpOwogICAgICAgIGludCBhID0gNzsKICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpvc3RyZWFtJik+IGwxID0gW2FdKHN0ZDo6b3N0cmVhbSYgb3MpIHsgb3MgPDwgIkNhcHR1cmVbYT0iIDw8IGEgPDwgIl1cbiI7IH07CiAgICAgICAgc3RkOjpjb3V0IDw8IHNpemVvZihhKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgbDEoc3RkOjpjb3V0KTsKICAgIH0KICAgIHsKICAgICAgICBGbGFnR3VhcmQgZmcobWVtb3J5X3ZlcmJvc2UpOwogICAgICAgIHN0cnVjdCBWTFMKICAgICAgICB7CiAgICAgICAgICAgICBjaGFyIGJzWzIwMF0gPSAiVmVyeSwgdmVyeSwgLCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5LCB2ZXJ5IGxvbmcgc3RyaW5nIjsKICAgICAgICB9OwogICAgICAgIFZMUyB2bHM7CiAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6b3N0cmVhbSYpPiBsMSA9IFt2bHNdKHN0ZDo6b3N0cmVhbSYgb3MpIHsgb3MgPDwgIkNhcHR1cmVbdmxzPSIgPDwgdmxzLmJzIDw8ICJdXG4iOyB9OwogICAgICAgIGwxKHN0ZDo6Y291dCk7CiAgICB9Cn0K
16
4
void* operator new(std::size_t, const std::nothrow_t&):100:0x9e32008
void operator delete(void*):0x9e32008
void* operator new(std::size_t):1:0x9e32008
No capture
void operator delete(void*):0x9e32008
void* operator new(std::size_t):4:0x9e32008
4
Capture[a=7]
void operator delete(void*):0x9e32008
void* operator new(std::size_t):200:0x9e32018
Capture[vls=Very, very, , very, very, very, very, very, very, very, very, very, very, very, very, very, very, very long string]
void operator delete(void*):0x9e32018