【问题标题】:C++ - Dynamic memory allocation required memoryC++ - 动态内存分配所需的内存
【发布时间】:2011-06-17 16:26:02
【问题描述】:

如果我想为int 对象动态分配内存,我可以这样做:

int *x = new int;

在这种情况下,我知道堆为 int 对象保留了 4-bytes 的内存。

但是,如果我有一个user-defined 类(类型)并想动态分配内存,如下:

Car *c = new Car;

我如何知道在堆上为Car 对象保留所需的内存量?

谢谢。

【问题讨论】:

标签: c++ size heap-memory dynamic-memory-allocation new-operator


【解决方案1】:

您想使用sizeof 运算符。 sizeof 运算符以字节为单位返回类型的大小,并在编译时进行评估。这对于malloc 特别有用,因为 malloc 要求您指定需要分配多少字节。但是,您使用的是 C++,new 会自动为您执行此操作。

sizeof 运算符返回 size_t 类型,该类型可在 cstddefstddef.h 中找到

示例代码:

size_t size_in_bytes = sizeof(Car);

【讨论】:

    【解决方案2】:

    您正在寻找sizeof()。请注意,由于内存填充和/或对齐,此值可能大于用户定义类型的预期值。

    【讨论】:

      【解决方案3】:

      有关如何确定类对象大小的信息,请参阅this 文章。您可以通过以下方式以编程方式使用它:

      size_t car_size = sizeof(Car);
      

      【讨论】:

        【解决方案4】:

        这将是sizeof(Car) 字节。编译器会自动执行此操作,您无需执行任何特定操作。

        【讨论】:

        • @Ashot Martirosyan:当您执行new 时,仅分配sizeof(pointer)。所以上面的说法还是正确的。它将是最小(因为它可能被填充)sizeof(Car) 字节。拥有指向动态内存的指针不会改变任何东西。
        • 当你在做 new 时,你正在调用 Car 的构造函数,它可以分配动态内存。如果提问者的意思只是类本身的记忆,那么你的答案是正确的。
        • @Ashot Martirosyan:据我所知,这就是问题所在。在我看来,OP 是在询问您执行 new Car; 时会发生什么,即编译器如何计算要分配多少内存。
        • @Ashot new 调用构造函数,构造函数进行初始化。在构造函数中完成的任何分配都与Car 的大小无关,因为Car 已经被分配...
        猜你喜欢
        • 1970-01-01
        • 2015-12-07
        • 2015-06-27
        • 2021-02-28
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 2015-09-25
        相关资源
        最近更新 更多