操作员新实施可见性问题

Operator new implementation visibility issue

本文关键字:可见性问题 新实施 操作员      更新时间:2023-10-16

据说,作为一个很好的做法,在为类实施操作员new的一种形式时,建议还必须实现所有其他表格。如果不这样做,由于c++不是直观的可见性规则,可能会发生坏事。这些坏事是什么?如何发生?可以隐藏未实现的表格吗?

我假设您在谈论超载全局运算符new功能与特定类别的operator new

tl; dr:如果您想具有细粒度的内存控制,则可能希望考虑使用分配器范式(如标准容器)。规则复杂且容易出错。

实施所有这些的最常见原因是由于令人困惑的呼叫上下文所致。通常,特定于班级的新事物将根据全球运营商进行。但是,这不是必需的,因此您会感到惊讶。

例如,假设您写了class Aclass B,并且要控制分配。您为AB编写覆盖。

void *very_clever_allocator(size_t sz);
class A {
    void* operator new(size_t sz) {
        return very_clever_allocator(sz);
    }
};
class B {
    void* operator new(size_t sz) {
        return very_clever_allocator(sz);
    }
};

您的代码的良好用户写道:

void *operator(size_t sz) {
    return incompatible_allocator(sz);
}

如果某人使用::new A;分配您的课程,则忽略了特定于类的版本。因此,突然间,使用了不同的分配器。程序员可能不小心,并调用删除。由于您非常小心,因此您还定义了operator delete。但是现在,您的very_clever_allocator不知道此对象。这将很难诊断出错误。

这并不常见,但是由于这些规则非常复杂,因此使用Allocator通常更容易。如果您只是写代码要调试,这是可以在一次的事情上进行的。

更多阅读:https://eli.thegreenplace.net/2011/02/17/the-many-faces-operator-operator-new-inew-in-c