new 一个对象,用free去释放,会有什么问题
2016-12-31 21:38
260 查看
如果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;
相关文章推荐
- 如果new 一个对象,用free去释放,会有什么问题?
- unity lua C# 这边 new 了一个GameObject 对象并发给Lua那边, 这时C# 这边在通过GC释放掉这个对象;lua 那边会报错;遇到这种问题的解决方案
- 用Free来释放New出来的东西会发生什么
- new 一个对象的时候加括号和不加括号有什么区别
- new一个对象,到底会发生什么
- 对一个包含虚函数成员的对象bzero()会有什么问题?
- js中new 一个对象内部发生了什么?
- Java中实例是什么意思?补充:new 一个对象是实例吗? 能举个小例子吗?
- 用Free来释放New出来的东西会发生什么
- 1.在使用new创建数组后,此时数组还是一个引用数组。 只有再创建新的对象,并把对象赋值给数组引用,到此初始化结束2.什么是引用类型?
- static静态方法可以被继承吗?Student a= new Student(); new一个对象的过程发生了什么?
- 新new 的一个对象不对它进行任何操作,直接返回,将返回什么?
- new一个类对象和使用类名创建一个对象有什么区别?
- new一个类对象和使用类名创建一个对象有什么区别?该怎么解决
- new一个对象的过程发生了什么
- java中new出来一个对象和定义一个对象赋值为空有什么不同
- 面试中遇到的问题:一个指针重复释放会出现什么情况
- 一个关于多线程对象释放的问题
- java继承,多态方面的一个问题,定义一个父类对象,用子类new
- 创建一个对象 new 与 不加new 有什么区别