new对象与之前C的"类 对象"方式有所不同,"类 对象"方式并不会调用构造函数和析构函数,而new对象则会调用两个函数,释放该空间时用delete。
数组
申请int类型的数组
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main() {
int* a = new int[10];
for (int i = 0; i < 10; i++) {
a[i] = i + 1;
}
for (int i = 0; i < 10; i++) {
cout << "a[" << i << "]=" << a[i] << endl;
}
delete[] a;
system("pause");
return EXIT_SUCCESS;
}
申请char类型
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main() {
char* a = new char[10];
memset(a, 0, 10);
strcpy(a, "123456789");
cout << "a=" << a << endl;
delete[] a;
system("pause");
return EXIT_SUCCESS;
}
注意:
如果new对象是数组,那么在释放空间的时候也要加上[]。否则只能释放数组中第一个元素的空间(虽然编译器在一些情况下可能不会报错)
如下面的例子
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class M {
public:
M() {
cout << "无参构造函数" << endl;
}
M(const M& t) {
cout << "拷贝构造函数" << endl;
}
~M()
{
cout << "析构函数" << endl;
}
};
int main() {
M *p1 = new M[2];
delete p1;
system("pause");
return EXIT_SUCCESS;
}
此时编译器不会报错,但运行过程中会出现问题。同时我们可以看到,因为数组大小是2,所以构造函数调用了两次,而因为在释放空间的时候没有加[],析构函数只是调用了一次。所以应当加上[]。
如果对象的类型是void*,编译器在编译的时候不知道void*指向的是那个函数,所以在删除的时候不会调用析构函数。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class M {
public:
M() {
cout << "无参构造函数" << endl;
}
M(const M& t) {
cout << "拷贝构造函数" << endl;
}
~M()
{
cout << "析构函数" << endl;
}
};
int main() {
void *p1 = new M;
delete p1;
system("pause");
return EXIT_SUCCESS;
}
标签:10,SECURE,CRT,对象,namespace,C++,int,new
From: https://blog.csdn.net/immnature/article/details/141188527