美文网首页C++ 杂记
C++ 禁止用户使用 new 的方式创建堆对象

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

作者: 赵者也 | 来源:发表于2020-06-20 23:13 被阅读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 只是面无表情的堆空间分配和释放机器。

    相关文章

      网友评论

        本文标题:C++ 禁止用户使用 new 的方式创建堆对象

        本文链接:https://www.haomeiwen.com/subject/gvzdwhtx.html