创建一个类
class Test {
public:Test() { std::cout << "constructor"; }virtual ~Test() {}void print() { std::cout << "a:" << a; }private:int a = 10;
};
main函数
int main(int argv, char **args)
{std::cout << "class size:" << sizeof(Test);void *ptr = ::malloc(sizeof(Test));std::cout << "new class";new (ptr) Test;std::cout << "convert";Test *test = (Test *)ptr;test->print();delete test;::free(ptr);return 0;
}
输出
class size: 16 
new class 
constructor 
convert
a: 10 
free(): double free detected in tcache 2
Aborted (core dumped)
这里例子通过malloc分配了 class Test需要的内存空间
 new (ptr) Test实际上就是将ptr内存分配给了class Test
 可以看到调用了new (ptr) Test后, 就调用了class Test的构造函数
通过 Test *test = (Test *)ptr
 将ptr转换class Test后
 就可以调用class Test的函数
最后可以看到当调用delete test后再调用::free(ptr)后
 就触发了
 free(): double free detected in tcache 2
 Aborted (core dumped)
所以ptr和class Test访问的都是同一块内存
这就是内存池一个大致的原理
 通过预先申请一块, 每当new的时候, 就是将预先申请的内存分配给class
 delete的时候, 只是程序回收了这个内存块, 不是返还给系统
再看一个例子, 将class修改一下
class Test {
public:Test(int _A) : a(_A) { std::cout << "constructor"; }virtual ~Test() { std::cout << "destructor, a: " << a; }void print() { std::cout << "a:" << a; }private:int a;
};
main函数
int main(int argv, char **args)
{std::cout << "class size:" << sizeof(Test);void *ptr = ::malloc(sizeof(Test) * 10);new (ptr) Test(10);Test *test = (Test *)ptr;test->print();new ((void *)((Test *)ptr + sizeof(Test))) Test(20);Test *test2 = ((Test *)ptr + sizeof(Test));test2->print();delete test;delete test2;::free(ptr);return 0;
}输出
class size: 16 
constructor 
a: 10 
constructor 
a: 20 
destructor, a:  10 
destructor, a:  20 
free(): invalid pointer
Aborted (core dumped)