我无法解释为什么在示例代码中,对自定义ClientHello
的调用new Foo [4]
请求68字节 - 比它应该多4个字节({{1} }),而更神秘的调用operator new[]
正确地请求64个字节。请注意,当从sizeof(Foo) == 16
移除成员Foo::operator new[]( 4 * sizeof( Foo ) )
时,两个调用都正确请求16个字节(ideone上的代码)。
std::vector<long> m_dummy
答案 0 :(得分:5)
根据标准( 5.3.4新):
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> def foo(i, l): ... i = 5 # this creates a new variable which is also called i ... l = [1, 2] # this changes the existing variable called l ... >>> i = 10 >>> l = [1, 2, 3] >>> print(i) 10 >>> print(l) [1, 2, 3] >>> foo(i, l) >>> print(i) 10 >>> print(l) [1, 2, 3]
会调用new T[5]
这里,
operator new[](sizeof(T)*5+x)
...是表示数组分配开销的非负未指定值;结果 new-expression将从运算符x
返回的值中偏移此量。 ...从一个
new[]
的调用到另一个调用,开销可能会有所不同。
实际上,它可以用来表示分配元素的数量。正如 @vsoftco 所评论的那样,“这就是运营商new
知道如何执行清理的方式”。
请参阅 18.6.1.2数组表单:
中的脚注
delete[]
或operator new[](std::size_t)
直接负责注意数组的重复次数或元素大小。这些操作在数组operator delete[](void*)
和new
表达式的其他位置执行。但是,数组delete
表达式可以将new
参数增加到size
以获取存储补充信息的空间。