堆与拷贝构造函数

Posted 1314bjwg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆与拷贝构造函数相关的知识,希望对你有一定的参考价值。

一:概述:

(1):

1:在C++中,堆分配的概念得到了扩展,不仅C++的关键字new和delete可以分配和释放堆空间,而且通过new建立的对象要调用构造函数,
通过delete删除对象也要调用析构函数。

(2):c++程序的内存分配机制:

(1):c++程序的内存格局分为四个区,
1:全局数据区
2:代码区
3:堆区
4:栈区
(2):从此可以知道学习一门计算机语言,最基本的是数据结构的学习.
全局变量、静态数据、常量及字面量存放在全局数据区,所有类成员函数和非成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、
返回数据、返回地址等存放在栈区,余下的空间都被作为堆区.

 (3):malloc(),free(),和new ,delete的区别:

#include <iostream>
#include "malloc.h"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class test
{
    public:
        test(); //声名test()函数;
        ~test(); //声明test类的析构函数 
        void out_date();
    protected:
        int day = 0;
        int year = 0;
};
test::test()
{
    cout<<"执行构造函数"<<endl;
    day = 27;
    year = 2020;
 } 
test::~test()
{
    cout<<"执行析构函数"<<endl;
}
void test::out_date()
{
    cout<<"the year is "<<this->year<<endl;
    cout<<"the day  is "<<this->day<<endl;
}
int main(int argc, char** argv)
{
    test *p; //p仅仅是一个类类型的指针; 
    p = (test*)malloc(sizeof(test)); //没有调用构造函数 
    free(p); //没有调用析构函数 
    p->out_date(); //输出的结构没有经过构造函数.
    return 0;
}
【注意day出现的现象:】

/*
malloc()仅仅只是一个函数调用,他没有足够的信息来调用一个构造函数,他所接受的参数是一个unsigned long类型,返回的数据类型是一个指针.
p从malloc()那儿获得的不过是一个含有随机数据的类对象空间而已,对应的对象空间中的值不确定。为此,须在内存分配之后再进行初始化。
*/

 

技术图片

#include <iostream>
#include "malloc.h"
/*
1:构造函数可以有参数,所以跟在new后面的类类型也可以跟参数
2:函数结束标记“}”,要么遇到返回语句)自动调用析构函数。但是堆对象的作用域是整个程序生命期,
所以除非程序运行完毕,否则堆对象作用域不会到期.
*/
using namespace std;
class test
{
    public:
        test(); //声名test()函数;
        test(int s);//构造函数重载, 
        ~test(); //声明test类的析构函数 
        void out_date();
    protected:
        int day = 0;
        int year = 0;
};
test::test(int s)
{
    cout<<"带参数的构造函数s=="<<s<<endl; //输出3 
}
test::test()
{
    cout<<"执行构造函数"<<endl;
    day = 27;
    year = 2020;
 } 
test::~test()
{
    cout<<"执行析构函数"<<endl;
}
void test::out_date()
{
    cout<<"the year is "<<this->year<<endl;
    cout<<"the day  is "<<this->day<<endl;
}
int main(int argc, char** argv)
{
    test *p; //p仅仅是一个类类型的指针; 
//new可以根据参数来调用构造函数 
    p = new test(3); //分配堆空间,并执行构造函数 
    delete p; //手动调用析构函数 
}

(4):拷贝构造函数:即用一个对象去构造另一个构造函数,拷贝的意思:可以理解成u盘从某硬件上拷贝来东西。

 

以上是关于堆与拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

堆与栈 | 对象深浅拷贝

在 Visual Studio 中创建构造函数的代码片段或快捷方式

关于C++默认拷贝构造函数

拷贝构造函数(c++常问问题一)

拷贝构造函数

Android 逆向ART 脱壳 ( DexClassLoader 脱壳 | DexClassLoader 构造函数 | 参考 Dalvik 的 DexClassLoader 类加载流程 )(代码片段