C++面试题-指针-动态内存指针

C++面试题-指针-动态内存指针

问:什么是内存泄漏和内存溢出?

答:内存泄漏:在程序申请内存后,该内存不再会被引用,但是不能释放该内存空间。如果你delete指针之后,该空间不能归还,自己又不能进行访问(找不到该内存的地址)。

内存溢出:系统预定好的内存空间不满足程序在请求的内存大小,不够用,就是内存越界。(比如一个由系统分配固定大小的数组存放大于该数组的一组数据,便是溢出)主要的情况就是栈溢出,栈内存不足。还有一种情况是缓冲区溢出。

内存上溢:栈满时,再进行入栈运算。

内存下溢:空栈(栈里面没有数据),再进行出栈运算

 

问:malloc函数前面为什么一定要强制转换成相应的类型?

答:因为malloc的返回值是void*类型的,表明还不清楚指向的指针类型是什么。在堆上申请好内存之后,在运用过程中,只需要强制转换自己想要的指针类型就可以了。函数原型:void *malloc(size_t)

 

问:利用malloc函数申请内存块。如果内存不足,就发生什么情况?

答:如果内存不足,malloc就会返回NULL

 

问:malloc的参数是“0”或者“NULL”或者“负数”,会有什么意义?

答:

参数为0时,可能返回NULL,也可能返回一个指向分配了0字节区域的指针。

参数为NULL时,生成一个警告然后返回0字节。

参数为负数时,会引发一些问题。

 

问:请分析delete 指针 delete[] 指针的区别?

答:比如:

Button *btn = new Button();

就用 delete btn;

int *arr = new int[100];

就用 delete [] arr;

 

问:下面代码输出结果是?

void array(int *arr, int size, int value)

{

    if (arr != NULL)

    {

        for (int i = 0; i < size; i++)

        {

            arr[i] = value;

            value++;

        }

    }

}

int main()

{

    int *vector = (int*)malloc(5*sizeof(int));

    array(vector,5,1);

    for (int i = 0; i < 5; i++)

    {

    cout << *(vector + i) << endl;

    }

    return 0;

}

答:1   2   3    4     5

 

问:newdeletemallocfree关系?

答:delete会调用对象的析构函数,new对应free只会释放内存,new调用构造函数。mallocfreeC++/C语言的标准库函数,new/deleteC++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

 

问:deletedelete[]的区别是什么?

答:delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”deletenew配套,delete []new []配套。

MemTest *mTest1=new MemTest[10];

MemTest *mTest2=new MemTest;

Int *pInt1=new int [10];

Int *pInt2=new int;

delete[]pInt1; //-1-

delete[]pInt2; //-2-

delete[]mTest1;//-3-

delete[]mTest2;//-4-

-4-处报错。

这就说明:对于内建简单数据类型,deletedelete[]功能是相同的。对于自定义的复杂数据类型,deletedelete[]不能互用。delete[]删除一个数组,delete删除一个指针。简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

 

问:如果创建对象是数组类型,例如CBook *pBooks=new CBook[5];.那么释放对象时,只用delete,会不会发生内存泄漏?

答:不一定会发生,但是这是不好的编码习惯。如果类的数据成员没有在堆区,不会发生内存泄漏。但是如果类的数据成员在堆区,是发生内存泄漏的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值