【问题标题】:Restrict client from allocating objects on heap C++限制客户端在堆 C++ 上分配对象
【发布时间】:2016-05-03 16:59:00
【问题描述】:

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

我已将 newnew[] 运算符声明为私有,但由于我要分配 X's objectsaddX(),因此我需要定义它们(运算符)。那么,它们的定义应该是什么样的呢?

【问题讨论】:

  • 您能否提供一个更完整的(伪)代码示例来说明您要实现的目标。此外,您应该详细说明您的用例以及您实际需要该限制的原因。
  • 我正在开发一个在内部处理所有对象的框架。用户只需调用 addThis() 或 removeThat() 等。
  • @ibe 您是否考虑过通过使构造函数(也可能是析构函数)private 来完全关闭创建,并且只提供创建对象的public 成员函数?如果您想控制对象的创建方式,那将是最简单的事情,IMO。

标签: c++ memory-management heap-memory


【解决方案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&) {}
};

【讨论】:

  • 这是实现这一目标的规范方式(并且不涉及实现new),尽管您应该考虑只定义create并返回一个智能指针以避免必须实现destroy并冒着调用者泄露分配内存的风险。
  • 我会让构造函数private 或应用final,这使用非虚拟~A()
【解决方案2】:

这很容易。

#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();
}

【讨论】:

  • 这允许在堆栈上创建X 的实例(即:X x; 有效)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2013-01-25
  • 2020-12-19
  • 2020-03-30
  • 2011-05-05
相关资源
最近更新 更多