c++动态对象

目录

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释放 [] 这个数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值