new/delete动态管理对象,new[]/delete[]动态管理对象数组。
图片.pngC++中,把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<iostream>
#include<cstring>
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 << ":" <<s1[i] << endl;
// }
*(pia+3) = 99;
*(pi+3) = 99;
pi[2] = 12;
for(int j = 0;j < 10; j++ )
{
cout << j << ":" << *(pia+j)<< endl;
}
cout << "------------" << endl;
for(int j = 0;j < 10; j++ )
{
cout << j << ":" << *(pi+j)<< endl;
}
cout << "------------" << endl;
delete [] pia;
delete [] pi;
return 0;
}
}
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<iostream>
#include<cstring>
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
网友评论