c++ new 和delete的种种


new/delete动态管理对象,new[]/delete[]动态管理对象数组。

图片.png

C++中,把int 、char..等内置类型的变量也看作对象,它们也是存在构造函数和析构函数的,只是通常对它们,系统调用了默认的构造函数来初始化以及默认的析构(编译器优化)。所以new int、new int(3)看起来和普通的定义好像没什么区别。
但对于自定义类型的对象,此种方式在创建对象的同时,还会将对象初始化好;于是new/delete、new []/delete []方式管理内存相对于malloc/free的方式管理的优势就体现出来了,因为它们能保证对象一被创建出来便被初始化,出了作用域便被自动清理。

malloc/free和new/delete的区别和联系

  • malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。

  • 它们都是动态管理内存的入口。

  • malloc/free是C/C++标准库的函数,new/delete是C++操作符。

  • malloc/free需要手动计算类型大小且返回值w为void*,new/delete可自动计算类型的大小,返回对应类型的指针。

  • malloc/free管理内存失败会返回0,new/delete等的方式管理内存失败会抛出异常。

#include 
#include

using namespace std;

    
int main()
{
    char * pia = new char[10];
    int * pi = new int[10];
    
    memset(pia,0,10*sizeof(pia));
    memset(pi,0,10*sizeof(pi));
//  for(int i = 0;i < 10; i++ )
//  {
//      *s1[i] = i;
//      cout << i << ":" <

out:

0:
1:
2:
3:c
4:
5:
6:
7:
8:
9:
10:
------------
0:0
1:0
2:12
3:99
4:0
5:0
6:0
7:0
8:0
9:0
------------

一个小练习:

1.new 一个char数组
2.全赋0x00
3.通过iostream的cin赋值
4.全部转换为大写
5.删除数组

#include
#include

using namespace std;

int main()
{
    char * num = new char[10];
    char temp;
    
    memset(num,0,10*sizeof(char));
    
    for(int i = 0;i < 10; i++)
    {
        cout << "num[" << i << "]:" << *(num+i) << endl;
//      cout << "num[" << i << "]:" << num[i] << endl;//两种访问方法
    }
        
    for(int j = 0;j < 10; j++)
    {
        cout << "num[" << j << "]:" ;
        cin >> temp;
        if(temp < 0)
        break;
        //cout << endl;
        *(num+j) = temp;
    }
    cout << "----------------" << endl;
    for(int i = 0;i < 10; i++)
    {
        cout << "num[" << i << "]:" << *(num+i) << endl;
//      cout << "num[" << i << "]:" << num[i] << endl;
    }
    
    for(int i = 0;i < 10; i++)
    {
        if ((*(num+i) >= 65)&&(*(num+i) <= 90))
            continue;
        else
            *(num+i) -= 32;
    }
    
    for(int i = 0;i < 10; i++)
    {
        cout << "num[" << i << "]:" << *(num+i) << endl;
    }
    
    delete[] num;
    return 0;
}

不错的链接:
new二维数组:https://blog.csdn.net/u012234115/article/details/36686457
动态分配:https://blog.csdn.net/shanzhizi/article/details/7835752?utm_source=distribute.pc_relevant.none-task
new/delete&new[]/delete[]:https://www.cnblogs.com/hazir/p/new_and_delete.html

你可能感兴趣的:(c++ new 和delete的种种)