#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;
class Test
{
public:
Test(int data = 0)
:_data(data)
{
cout << "Test():" << this << endl;
}
~Test()
{
cout << "~Test():" << this << endl;
}
private:
int _data;
};
Test* New()
{
Test* p1 = (Test*)malloc(sizeof(Test));
if (p1 = NULL)
{
assert(0);
}
new(p1)Test();
return p1;
}
void Delete(Test* p)
{
if (p)
{
p->~Test();
free(p);
}
}
Test* NewArray(size_t N)
{
int* p = (int*)malloc(sizeof(Test)*N + 4);//多余的4个字节存储调用构造函数的次数;
*p = N;
Test* pt = (Test*)(p + 1);
for (int i = 0; i < N; ++i)
{
new(pt + i) Test;
}
return pt;
}
void DeleteArray(Test* p)
{
if (NULL == p)
{
return;
}
int *ps = (int*)p - 1;
size_t N = *ps; //拿到调用析构函数的次数
for (int i = N - 1; i >= 0; --i)
{
p[i].~Test();
}
free(ps);
}
int main()
{
Test* pt1 = New();
Delete(pt1);
Test* pt2 = NewArray(10);
DeleteArray(pt2);
return 0;
}
使用定位new操作符实现new、delete、new[]、delete[]操作符
最新推荐文章于 2023-11-12 12:24:24 发布