加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C内存分配

发布时间:2020-12-16 06:48:10 所属栏目:百科 来源:网络整理
导读:使用C时 如果有一个班级: class MyClass{ char memory1bye; int memory4bytes; int another4bytes;}; 这个类在内存中总共使用9个字节…所以,如果我做了类似的事情: MyClass *t1; 这将为我提供Class的可用地址,但是它会分配9个字节吗?它会调用默认构造函数
使用C时
如果有一个班级:

class MyClass
{
    char memory1bye;
    int memory4bytes;
    int another4bytes;
};

这个类在内存中总共使用9个字节…所以,如果我做了类似的事情:

MyClass *t1;

这将为我提供Class的可用地址,但是它会分配9个字节吗?它会调用默认构造函数吗?
或者我需要将这9个字节malloc给该类吗?
如果那时我打电话给:

t1 = (MyClass *)new MyClass;

是否会被视为内存泄漏?换句话说,旧地址会发生什么?

解决方法

>正如许多人所说,MyClass的大小取决于实现.在这种情况下,因为类没有方法,所以你基本上有一个结构,所以可以对大小做一些合理的猜测.在没有任何异常编译器标志的普通现代32位机器上,结构的大小将为12个字节;这是因为默认情况下,字段在当前体系结构上与4字节边界对齐.

在64位机器上它可能更大,但如果它大于24字节(即每个字段的8字节对齐),我会有点惊讶.除非明确告知,否则我认为任何事情都不会使用任何大于8字节对齐的字段,并且对字段使用较大的对齐值没有多大意义,因为内存分配函数本身通常具有8字节对齐. (注意:不要指望你的机器是真的!)

实际知道任何东西大小的唯一方法是使用sizeof(MyClass).您几乎不需要在C中使用它,因为新运算符会为您了解并分配所需的空间量.并且如前所述,请记住,任何东西(除了char)的大小都不可移植,即使它们实际上没有无偿变化.
>做MyClass * t1;不分配任何东西.它只是为您提供了存储对象地址(特别是MyClass实例)的位置.默认情况下,如果变量位于任何局部范围或类或结构定义中,则该空间指向la-la land.如果您不打算在变量中放置一个地址,那么将它显式初始化为NULL可能是一个好主意,这样它至少可以指向一个明确的非对象.
>你的t1 =(MyClass *)新的MyClass;包含一个不必要的强制转换,因为new返回一个指向该类型对象的指针.做t1 = new MyClass;足够.
>如果t1以前指向一个对象并且是指向它的唯一变量,那么就会发生内存泄漏(假设您没有使用垃圾收集器库;大多数C程序都是在不使用它们的情况下编写的).如果其他东西指向对象,那么最好承担清理它的责任.如果地址没有指向任何特定的地址,或者它指向NULL,则没有任何泄漏.

请记住,地址不会泄漏;物体泄漏.

您可以通过在堆栈上创建对象(使用直接的MyClass t1;)并通过引用而不是地址传递它们来缓解内存泄漏;当对象超出范围时,将自动删除该对象.当你有一个对象的生命周期不能很好地耦合到特定范围时,这样做的主要缺点就出现了.那是你使用指针(或智能指针,它以一些限制为代价隐藏大部分细节).真正复杂的代码在垃圾收集方面更好,尽管它有自己的权衡(特别是包括更有可能增加内存消耗;这是Java因为比C更需要内存而闻名的核心原因).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读