C++ 运营商新的实施可见性问题
据说,作为一种良好的实践,当为一个类实现操作符C++ 运营商新的实施可见性问题,c++,operator-overloading,new-operator,C++,Operator Overloading,New Operator,据说,作为一种良好的实践,当为一个类实现操作符new的一种形式时,建议还必须实现所有其他形式。如果不这样做,由于c++不是直观的可见性规则,可能会发生不好的事情。这些坏事情是什么?它们是如何发生的?无法实现的表单会被隐藏吗?我假设您谈论的是重载全局运算符new函数,而不是类特定的运算符new TL;DR:如果您希望有细粒度的内存控制,您可能希望考虑使用分配器范例,例如标准容器。规则复杂且容易出错 实现所有这些功能最常见的原因是调用上下文混乱。通常,特定于类的new将根据全局运算符来实现。但是,这
new
的一种形式时,建议还必须实现所有其他形式。如果不这样做,由于c++
不是直观的可见性规则,可能会发生不好的事情。这些坏事情是什么?它们是如何发生的?无法实现的表单会被隐藏吗?我假设您谈论的是重载全局运算符new
函数,而不是类特定的运算符new
TL;DR:如果您希望有细粒度的内存控制,您可能希望考虑使用分配器范例,例如标准容器。规则复杂且容易出错
实现所有这些功能最常见的原因是调用上下文混乱。通常,特定于类的new将根据全局运算符来实现。但是,这不是必需的,因此您可能会感到惊讶
例如,假设您编写了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代码>则忽略特定于类的版本。因此,突然之间,使用了不同的分配器。程序员可能不小心,调用delete。由于您非常小心,因此还定义了运算符delete
。但是现在,您的非常聪明的分配器不知道这个对象。这将是一个很难诊断的错误
这并不常见,但由于这些规则非常复杂,因此使用分配器通常更容易。如果您只是编写代码进行调试,那么只需一次就可以了
更多阅读: