限制客户端在堆C ++上分配对象

时间:2016-05-03 16:59:01

标签: c++ memory-management heap

我有一个类X和方法addX(),它在堆上分配X的对象。我想限制客户端代码直接分配X的对象(以便不允许X *ptr = new X)。

我已宣布newnew[]运营商为私有,但由于我通过X's objects分配addX(),我需要定义它们(运营商)。那么,他们的定义应该是什么样的呢?

2 个答案:

答案 0 :(得分:1)

这很简单。

#include <iostream>
#include <new>

class X {
public:
    static void addX()
    {
        X* p1 = new X;
        delete p1;
    }
private:
    void* operator new(std::size_t sz)
    {
        std::cout << "custom new for size " << sz << '\n';
        return ::operator new(sz);
    }
    void* operator new[](std::size_t sz)
    {
        return ::operator new(sz);
    }
};

int main()
{
    X::addX();
}

答案 1 :(得分:1)

隐藏构造函数,使用工厂函数:

class A
{
public:
    static A* create() { return new A; }
    static void destroy(A* a) { delete a; }
protected:
   A() {}
   A(const A&) {}
   A& operator=(const A&) {}
};