目录
malloc和free动态申请
c++中动态申请
用于数组的 new 和 delete
delete void*问题
使用 new 和 delete 采用相同形式
malloc和free动态申请
在c++中 释放对象时 系统会自动调用析构函数 但在以下代码编译运行后 析构和构造均未调用 所以在c++中不能用malloc和free动态申请空间 而是用new和delete
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
class Person
{
public:
Person()
{
cout << "构造" << endl;
}
~Person()
{
cout << "析构" << endl;
}
};
void test()
{
Person *p = (Person *)malloc(sizeof(Person));
free(p);
}
int main()
{
test();
return 0;
}
c++中动态申请
类型 * p = new 类型;
delete p;
申请数组:
类型 * p = new 类型[n];
delete []p;
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
class person
{
public:
person()
{
cout << "构造" <<endl;
}
~person()
{
cout << "析构" <<endl;
}
};
void test01()
{
int *p = new int;//申请一块内存 sizeof(int)大小
cout << *p << endl;
*p = 100;
cout << *p << endl;
delete p;//释放
}
//申请一个对象
void test02()
{
person *p = new person;//调用无参构造
delete p;
//注意 new对象的数组时 不能调用有参构造 只能调用无参构造
}
//申请一个数组
void test03()
{
int *p = new int[10];
for(int i = 0;i<10;i++)
{
p[i] = i + 100;
}
for(int i = 0;i<10;i++)
{
cout<< p[i] <<"";
}
cout<<endl;
delete []p;
}
int main()
{
test01();
test02();
test03();
return 0;
}
用于数组的 new 和 delete
void test02()
{//new时调用有参构造
person *p = new person(10);delete p;
person *p1 = new person[10]; //注意 new对象的数组时 不能调用有参构造 只能调用无参构造
delete []p1;
}
delete void*问题
如果对一个
void*
指针执行
delete
操作,这将可能成为一个程序错误,除非指针指向的内容是非常简单的,因为它将不执行析构函数.
以下代码未调用析构函数,导致可用内存减少
void test(){void * person = new Person( "john" , 20 );delete person;}
使用 new 和 delete 采用相同形式
new一个单一的对象时 delete释放单一的对象
new一个数组时 delete释放 [] 这个数组