操作员新实施可见性问题
Operator new implementation visibility issue
据说,作为一个很好的做法,在为类实施操作员new
的一种形式时,建议还必须实现所有其他表格。如果不这样做,由于c++
不是直观的可见性规则,可能会发生坏事。这些坏事是什么?如何发生?可以隐藏未实现的表格吗?
我假设您在谈论超载全局运算符new
功能与特定类别的operator new
。
tl; dr:如果您想具有细粒度的内存控制,则可能希望考虑使用分配器范式(如标准容器)。规则复杂且容易出错。
实施所有这些的最常见原因是由于令人困惑的呼叫上下文所致。通常,特定于班级的新事物将根据全球运营商进行。但是,这不是必需的,因此您会感到惊讶。
例如,假设您写了class A
和class B
,并且要控制分配。您为A
和B
编写覆盖。
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
相关文章:
- C++boost序列化多态性问题
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- OpenMP for 循环并行性问题
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 操作员新实施可见性问题
- 无锁的堆栈:在POP()期间检查危险指针时可见性问题
- 基类的复制构造函数的可见性问题
- C++线程与可见性问题 - 常见的工程实践是什么?
- 名称空间和作用域可见性问题