自定义运算符new []请求大于预期的内存

时间:2015-10-14 23:01:48

标签: c++ operator-overloading new-operator

我无法解释为什么在示例代码中,对自定义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

1 个答案:

答案 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以获取存储补充信息的空间。