操作员新[]定义分解
operator new[] definition breakdown
我很难消化这个语法:
void* operator new[](std::size_t, const std::nothrow_t&) throw();
尽管这一点仍被理解:
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
问题:
我认为
new
和下标[]
是不同的运算符。我们如何将两个运算符组合在一个定义中重载?还有CCD_ 3。下面的调用对我来说没有意义(关于函数的签名)。
int * p2 = new (nothrow) int;
如果有人能参考比约恩·斯特鲁斯特鲁普的书中的相关主题,那就太好了,尽管这不是一个硬性要求。
更新:请尝试回答这两个问题:)
new[]和[]是两个完全不同的运算符。
new[]是数组的分配运算符,[]是数组中的下标访问运算符。
new[]是它自己的运算符,它不是简单的"new"分配器与"[]"下标运算符组合。
前两个是全局new运算符的签名。不管值多少钱,operator new
被用来为像x = new T;
这样的新表达式分配空间,而operator new[]
被用来为x = new T[count];
这样的新表达分配空间。它的"小"价值有一个相当简单的原因:你永远不应该使用new T[count]
,所以它的工作原理几乎完全是历史的好奇心。
如果需要的话,可以重载::operator new
和/或::operator new[]
来提供自己的堆分配。就基本需求而言,这两者之间没有什么区别——它们都只是分配并返回一个指向请求内存量的指针。
就nothrow
而言,传递给operator new
的大小总是由编译器根据对象的大小来计算的,在数组为new的情况下,则是您给出的计数。因此,在新表达式中指定的参数将变为传递给operator new
的第二个参数。
为了强调一点,我在上面可能还不够清楚:operator new
(和operator new[]
)由使用,但与新的表达式(当你说类似x = new T;
的话时,你的代码中有什么)是分开的。operator new
和operator new[]
很像malloc
——它们只是分配"原始"内存。一个新的表达式1使用其中一个来分配原始内存,然后调用构造函数来分配该内存中的一个对象(在new T[count];
的情况下,可以是多个对象)。这两者显然是有关联的,但同样明显地并不完全相同。
还有一个小问题:也可以将operator new
(或operator new[]
)作为类成员。这使您可以为该类分配与使用全局堆的其他类不同的内存。这在您希望大量分配的小对象中最为常见。对于这些对象,全局堆通常有相当多的开销,您希望避免。
最后,当/如果您想要分配原始内存,也可以直接调用operator new
,如void *a = ::operator new(1234);
中所示。唯一常见的地方是,如果您决定自己实现某种集合类(例如,如果您想要一个循环缓冲区)。
new
和new[]
是两个独立的运算符,与"[]"运算符没有真正的关系。这在CCD_ 27和CCD_;您是删除p
指向的单个实例,还是删除整个实例数组?
同样,nowthrow
0是一种分配整个对象阵列的方式,所有对象都在同一个内存块中。
- 在提升multi_index容器中,是否定义了"default index"?
- 通过递归进行因子分解
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 有人能分解一下这个c++模板的语法吗
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 操作员新[]定义分解
- 将此c++代码分解为单独的类规范文件和函数定义文件