【问题标题】:Are the sizes passed into A::operator new() always equal to sizeof(A)?传递给 A::operator new() 的大小是否总是等于 sizeof(A)?
【发布时间】:2013-08-27 03:46:54
【问题描述】:
struct A final
{
    int a;

    void* operator new(size_t size)
    {
        //
        // Is size always equal to sizeof(A) here?
        //
        return ::operator new(size); 
    }

    void operator delete(void* ptr)
    {
        ::operator delete(ptr);
    }
};

int main()
{
    for (auto i = 0; i < 100; i++)
    {
        delete new A;
    }
}

我的问题也嵌入在代码中。

C++ 标准是否保证传入 A::operator new() 的大小始终相同?

更新: 在这里,只考虑 A 只是一个 final 类。

【问题讨论】:

    标签: c++ memory-management c++11 operator-overloading standards


    【解决方案1】:

    引自 C++11 标准,第 5.3.4 节第 10 点:

    new-expression 将请求的空间量传递给 分配函数作为 std::size_t 类型的第一个参数。那 参数不得小于被创建对象的大小; 它可能大于正在创建的对象的大小,仅当 对象是一个数组。

    所以,是的,它保证与对象的大小相同。但是请注意,不同的编译器或不同的编译器选项可能会在编译时改变特定对象的实际大小。

    【讨论】:

      【解决方案2】:

      没有。

      试试:

      struct B: public A
      {
          double a;
      }
      

      现在,当您创建 B 时,新运算符将获得不同的大小

      int main()
      {
          for (auto i = 0; i < 100; i++)
          {
              delete new A;
              delete new B;
          }
      }
      

      PS 加个打印看看:

      void* operator new(size_t size)
      {
          std::cout << "S(" << size << ")\n";
          //
          // Is size always equal to sizeof(A) here?
          //
          return ::operator new(size); 
      }
      

      输出:

      > ./a.out
      S(4)
      S(12)
      S(4)
      S(12)
      S(4)
      

      【讨论】:

      • 如果A是final类呢?
      • @xmllmx:C++ 中没有这样的东西
      • 请查看帖子。我修改了它。我将 struct A 设为 final。
      • 'final' 是 C++11 中的合法关键字。
      • 原来如此。那么以上不适用。
      猜你喜欢
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2013-05-26
      • 1970-01-01
      • 2017-03-12
      相关资源
      最近更新 更多