我们需要使用到所谓的抽象混合式基类,所谓的抽象指该类至少含有一个纯虚函数,所谓的混合是指该类提供一组定义完好的接口,而该套接口与其派生类所可能提供的其他任何能力兼容。于是我们可以形成一个所谓的抽象混合式基类用来为派生类提供判断delete this是否有效的能力。实现如下
heapTracked.h
#pragma once
#include <list>
using namespace std;
class HeapTracked
{
public:
class MissingAddress {};
virtual ~HeapTracked() = 0;
static void *operator new(size_t size);
static void operator delete(void *ptr);
bool isOnHeap() const;
private:
static list<const void *> address;
};
heapTracked.cpp
#include "heapTracked.h"
list<const void *> HeapTracked::address;
HeapTracked::~HeapTracked()
{
}
void *HeapTracked::operator new(size_t size)
{
void *memPtr = ::operator new(size);
address.push_front(memPtr);
return memPtr;
}
void HeapTracked::operator delete(void * ptr)
{
list<const void *>::iterator it = find(address.begin(), address.end(), ptr);
if (it != address.end())
{
address.erase(it);
::operator delete(ptr);
}
else
{
throw MissingAddress();
}
}
bool HeapTracked::isOnHeap() const
{
const void *rawAddress = dynamic_cast<const void *>(this);
list<const void *>::iterator it = find(address.begin(), address.end(), rawAddress);
return it != address.end();
}
main.cpp
#include <iostream>
#include "heapTracked.h"
using namespace std;
class Student
:public HeapTracked
{
public:
Student(int age)
:m_age(age)
{
cout << "construct" << endl;
}
private:
int m_age;
};
int main()
{
Student s(1);
Student *sPtr = new Student(33);
cout << s.isOnHeap() << endl;
cout << sPtr->isOnHeap() << endl;
system("pause");
return EXIT_SUCCESS;
}
以上做法的缺陷:无法在内建类型上使用,因为内建类型并不继承自任何东西,并且使用者如果使用HeapTracked这样的类,最常见的理由是要决定是否能够delete this,而我们绝对不会对内建类型这么做,因为内建类型根本没有this指针
来源:CSDN
作者:weixin_43718250
链接:https://blog.csdn.net/weixin_43718250/article/details/104124747