new 一个对象,用free去释放,会有什么问题

来源:互联网 发布:网络写手的现状 编辑:程序博客网 时间:2024/04/27 20:08

如果new 一个对象,用free去释放,会有什么问题?

587人阅读 收藏

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于C++里面的NEW/DELETE和maclloc/free。
昨天面试的时候被问到这个问题,如果new 一个对象,用free去释放,会有什么问题?
一时被问到这个陌生,于是就感觉来说,应该会报错。因为new与FREE不是配对的内存操作API。
后转念一想,delete也是清除分配的内存,free也是同样的功能,可能不会报错,再加上因为delete处理过程中比free多一步就是调用析构函数。所以说可能不报错,但没有对分配的对象作一些后续的析构清理动作。
今天就想写几行代码试下是否是这样。
先来看下在这段代码:
 
#include <iostream>
using namespace std;
class nf {
public:
     nf();
    ~nf();
public:
       int * get();
       void set(int i);
private:
       int * pi;
};

nf::nf()
 {
       cout << "nf construction" << endl;
       pi = new int(0);
        }
 nf::~nf()
{
       cout << "nf destruction" << endl;
       delete pi;
        }
 int * nf::get()
{
           return pi;
 }

void nf::set(int i)
{
        * pi = i;
}
int main()
{
       nf* pnf = new nf();
       pnf->set(100);
       int *pp = pnf->get();
       cout << *pp << endl;
       //delete pnf;
       free(pnf);
       cout << *pp << endl;
       return 0;
}

 上面这段代码里面定义了一个类。类里面有一个指针成员,为什么用指针成员是想把类的成员的内存通过new分配到堆上去。通过构造函数分配一块内存,然后通过析构函数去释放该内存。同时里面还定义了一个get()成员函数,返回该成员的指针。set()函数主要就是给成员指针所指的对象赋值。
 先来说一下正常的情况,正常情况下,通过new创建该类的一个对象,对象创建的时候会调用构造函数为成员指针申请一块内存,通过set()赋值后,该指针通过get()返回,再去通过指针读取到的值应该是set()里面的值。
 如果通过delete删除前面申请的对象,那么同样会调用析构函数,释放掉构造函数里面申请的内存,那么如果再通过get()返回的指针去读取的话,会得到不确定的值。
 
再来分析一下,如果用new创建对象,再用free去释放内存,结果会怎么样呢?
根据定义:new()函数实际过程中做了两步操作,第一步是分配内存空间,第二步是调用类的构造函数;delete()也同样是两步,第一步是调用类的析构函数,第二步才是释放内存;而malloc()和free()仅仅是分配内存与释放内存操作;
那么如果通过new分配的内存,再用free去释放,就会少一步调用析构函数的过程。同时,在构造函数里面申请的内存因为没有调用析构函数,所以该内存并没有释放,所以如果再输出该内存的值,那么应该还是原来设置的值100;

0 0
原创粉丝点击