C++ 杂记

C++ 禁止用户使用 new 的方式创建堆对象

2020-06-20  本文已影响0人  赵者也

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 方法创建堆对象以及测试输出

上面的示例中体现出如下信息:

  1. new/delete 操作符号可以被重载,malloc/free 是库函数,不能重载;
  2. new/delete 执行过程中会调用构造/析构函数,malloc/free 只是面无表情的堆空间分配和释放机器。
上一篇下一篇

猜你喜欢

热点阅读