C++ new的总结(让你少秃一天头)

本文详细介绍了C++中的动态内存管理,特别是关键字`new`的使用。通过实例解析了`new`在堆上创建对象的过程,包括调用构造函数、返回对象指针以及手动释放内存的重要性。同时,区分了栈变量和堆变量的区别,强调了栈变量的自动释放和堆变量的手动释放规则。此外,还讨论了`malloc`和`new`的不同,并提醒程序员注意防止内存泄漏。
摘要由CSDN通过智能技术生成

目录

1 总代码

2 引入

2.1 (1) 和 (2) 的最大不同

2.2 栈变量(局部变量)

2.3 堆变量

3 new的讲解

3.1 概述

3.2 典型的用法

3.2.1 概述

3.3 例子说明

3.3.1 (7) 的意思

3.3.2 (8) 的意思

3.3.3 (2) 的意思

4 总结


1 总代码

#include<iostream>
using namespace std;

int c = 2; // (5)

class Test
{
private:
    int c;

public:
    int a_pub;
    int b_pub1;
    
    // 3参构造函数
    Test(int x, int y, int z):a_pub(x),b_pub1(y),c(z)
    {
        cout << "进入了3参构造函数" << endl;
        cout << "a_pub:" << a_pub << " b_pub:" << b_pub1 << " c:" << c << endl;
    }
};

void Temp();
 
int main()
 
{
    Test t1 = Test(1,2,3); // (1)
    Test* t2 = new Test(1,2,3); // (2)

    int a = 1; // (3)
    Temp();

    int* d = (int*)malloc(sizeof(int)); // (6)
    int* e = new int; // (7)
    int* f = new int(1); // (8)
    
    delete(t2); // 不用的时候记得要手动释放内存
    free(d); // 不用的时候记得要手动释放内存
    delete(e); // 不用的时候记得要手动释放内存
    delete(f); // 不用的时候记得要手动释放内存

    return 0;
}

void Temp()
{
    int* b = NULL; // (4)
}


2 引入

2.1 (1)(2) 的最大不同

Tesk t1 = Tesk(1,2,3); // (1)
Test* t2 = new Test(1,2,3); // (2)
  • (1) 是在上创建了一个对象,属于局部变量(自动释放)。
  • (2) 是在上创建了一个对象,属于堆变量(手动释放)。

2.2 栈变量(局部变量)

void Temp();

int main()
{
    int a = 1; // (3)
    Temp();
    return 0;
}

void Temp()
{
    int* b = NULL; // (4)
}
  • 普通创建的变量被分配在栈(后进先出)上,称为栈变量(如 (1) 、(3)、(4) )。
  • 栈变量的生命周期是临时的。从它被创建的时候生,作用域结束的时候灭(自动释放)。
  • 由于栈变量是在栈上创建的,因此在非特殊情况下,最晚创建的变量将会最先被消灭。

2.3 堆变量

int c = 2; // (5)

int main()
{
    int* d = (int*)malloc(sizeof(int)); // (6)
    int* e = new int; // (7)
    int* f = new int(1); // (8)
    return 0;
}
  • 堆变量就是全局、静态、用 malloc 、new 等类似的关键字申请堆空间的变量(如 (5)、(6)、(7) 、(8) )(与关键字有关的一般返回的都是 指针 )。
  • 堆变量分配的空间 不会自动释放 ,若在程序中没有手动释放堆变量,它将一直占用系统内存。
  • 关于 malloc 与 new 的异同此处不展开,可参考博客 C/C++动态内存管理 。


3 new的讲解

3.1 概述

  • 当我们使用关键字 new 在堆上动态创建一个对象时,它实际上做了三件事( 只考虑申请空间成功的情况 ):

          1)申请一块新的、对应类型大小的内存空间(不会自动释放),创建该类型的对象。

          2)调用该类的构造函数,对对象进行初始化。

          3)返回指向该对象的指针。

  • 如果我们创建的是简单类型的变量(无构造函数的类型的变量),那么第二步会被省略。 
  • 想要释放该空间需要手动删除,即书写 delete(指针变量名); ,否则会造成内存的泄露。

3.2 典型的用法

3.2.1 概述

类型名* 指针变量名 = new 该对象的构造函数名( parameter1, ...);

  • 由于类型名=它的构造函数名故上述格式可写为:

类型名* 指针变量名 = new 类型名( parameter1, ...);

3.3 例子说明

int* e = new int; // (7)
int* f = new int(1); // (8)

delete(e); // 不用的时候记得要手动释放内存
delete(f); // 不用的时候记得要手动释放内存

3.3.1 (7) 的意思

  • 使用关键字 new 上申请一段 int 类型大的 空间(不会自动释放),创建一个 int 类型 的 对象 
  • 调用 int 的无参构造函数(相当于什么也没有做)。
  • 返回该 对象(int 类型) 的 指针 给指针变量 e 。

3.3.2 (8) 的意思

  • 使用关键字 new 在 堆 上申请一段 int 类型大的 空间(不会自动释放),创建一个 int 类型 的 对象 
  • 调用 int 的单参构造函数(即该对象 = 括号的1)。
  • 返回该 对象(int 类型) 的 指针 给指针变量 f ( 由于上一步,此时 *f = 1 )。

3.3.3 (2) 的意思

Tesk t1 = Tesk(1,2,3); // (1)
Test* t2 = new Test(1,2,3); // (2)

delete(t2); // 不用的时候记得要手动释放内存
  • 使用关键字 new 在 堆 上申请一段 Tesk 类型大的 空间(不会自动释放),创建一个 Tesk 类型 的 对象 
  • 调用 Tesk 的3参构造函数 

  • 返回该 Tesk 类型的对象 的 指针 给指针变量 t2 。


4 总结

  • 熬夜对身体有害。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值