【问题标题】:Determine size of Memory allocated by new operator in C++确定 C++ 中 new 运算符分配的内存大小
【发布时间】:2014-04-14 05:26:51
【问题描述】:

如何确定 C++ new 运算符分配的内存大小。 ?

在 C 中,malloc 的语法如下:

void *malloc(size_t size);

在这里我们知道我们分配的大小。

但是在 C++ 中,当我们如下进行内存分配时,我们如何确定分配的大小。我很想知道new 如何确定需要分配的大小。

foo *pFoo = new foo();

【问题讨论】:

  • 这个问题让我找到了一些有趣的参考资料。很明显,故意让你不容易知道一个物体有多大。 (毕竟,如果你以错误的方式使用这些信息,你会严重破坏封装。)但我当然可以想到你想知道的原因,这不是微不足道的......
  • 使用sizeof 运算符。
  • @JohnnyMopp sizeof() 可能返回 1。stackoverflow.com/questions/4338966/…
  • @RobP 这不太可能。这是可能的。您的链接没有比这更高。除了可能的 vtable 指针之外,它仍然是问题的答案。
  • @RobP: sizeof 在这里为空类返回 1 是可取的......new 也应该返回一个指向单个字节的不同指针。 5.3.4/14 "new T 导致调用 operator new(sizeof(T))"

标签: c++ memory-management


【解决方案1】:

C++ 运算符new 分配sizeof(T) 字节(使用标准全局分配器::operator new(size_t)T 的自定义分配器,如果已定义)。

之后它调用构造函数(首先是基类和其他子对象,然后是 T 本身的构造函数)。

然而,一些被调用的构造函数分配更多内存是可能的,甚至是常见的。

【讨论】:

    【解决方案2】:

    出于测试目的,您可以覆盖全局运算符 new 以了解分配了多少:

    void* operator new(size_t size)
    {
        std::cout << "allocating " << size << std::endl;
        return malloc(size);
    }
    

    [ 确实不推荐用于生产代码,但可以做到 - 请仔细阅读。].

    【讨论】:

      【解决方案3】:
      void *malloc(size_t size);
      

      在这里,您指定需要分配的大小,它返回的是 void*,您可以稍后将其转换为所需的指针类型。

      foo *pFoo = new foo();
      

      在这里,大小由新对象本身通过对象布局决定。还要注意 new 运算符调用 foo 的构造函数。如果您需要它与为 malloc 所做的一样,请按以下方式操作:

       void * ptr = new size_t[size];
      

      甚至不满意..!您可以按照自己的方式重载 new 运算符。谷歌重载新运算符。

      【讨论】:

      • 这不一样; sizeof(size_t) 不会是 1
      • 我是否告诉过 sizeof(size_t) 将是 1?
      • 您暗示new size_t[size]malloc 的作用相同。您希望 new char[size] 获取 size 字节。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 2011-08-03
      • 2014-12-11
      相关资源
      最近更新 更多