C++ 中可以通过重载 new 和 delete 操作符,来禁止用户使用 new 的方式创建堆对象的,但是我认为是没有办法完全禁止用户创建堆对象的,因为用户依然可以使用 malloc 的方式创建堆对象,并操作类。
#include <QCoreApplication>
#include <QDebug>
namespace {
const QString OUTPUT_INFO_SATRT("CreatStackOnly===debug output:");
}
class CreatStackOnly {
void* operator new(size_t) throw() { return nullptr;}
void operator delete(void*){}
public:
explicit CreatStackOnly(int number = 0)
: testNumber(number)
{
qDebug() << OUTPUT_INFO_SATRT << "CreatStackOnly() called";
}
~CreatStackOnly() {
qDebug() << OUTPUT_INFO_SATRT << "~CreatStackOnly() called";
}
void testFuction() {
qDebug() << OUTPUT_INFO_SATRT << "testNumber = " << testNumber;
qDebug() << OUTPUT_INFO_SATRT << "testFuction() called";
}
void setNumber(int number) {
testNumber = number;
}
private:
int testNumber = 0;
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CreatStackOnly * test = (CreatStackOnly*) malloc(sizeof (CreatStackOnly));
test->testFuction();
free(test);
test->testFuction();
test = nullptr;
test = (CreatStackOnly*) malloc(sizeof (CreatStackOnly));
test->setNumber(2020);
test->testFuction();
return a.exec();
}
此时当我们使用 new 操作符号时的编译器给出的错误提示信息:
使用 new 操作符号时的错误提示信息上述测试示例的输出结果:
使用 malloc 方法创建堆对象以及测试输出上面的示例中体现出如下信息:
- new/delete 操作符号可以被重载,malloc/free 是库函数,不能重载;
- new/delete 执行过程中会调用构造/析构函数,malloc/free 只是面无表情的堆空间分配和释放机器。
网友评论