Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运营商新的实施可见性问题_C++_Operator Overloading_New Operator - Fatal编程技术网

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
。但是现在,您的
非常聪明的分配器不知道这个对象。这将是一个很难诊断的错误

这并不常见,但由于这些规则非常复杂,因此使用
分配器通常更容易。如果您只是编写代码进行调试,那么只需一次就可以了

更多阅读: