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
- 如果new 一个对象,用free去释放,会有什么问题?
- new 一个对象,用free去释放,会有什么问题
- 用Free来释放New出来的东西会发生什么
- 用Free来释放New出来的东西会发生什么
- new一个对象,到底会发生什么
- js中new一个对象会发生什么
- 对一个包含虚函数成员的对象bzero()会有什么问题?
- new一个类对象和使用类名创建一个对象有什么区别?
- new一个类对象和使用类名创建一个对象有什么区别?
- new一个类对象和使用类名创建一个对象有什么区别?
- malloc与free和new与delete有什么区别
- 面试中遇到的问题:一个指针重复释放会出现什么情况
- Free()内存释放问题
- new一个对象的时候,几种情况各有什么不同
- new 一个对象的时候加括号和不加括号有什么区别
- Javascript中调用一个函数(对象),使用new或者直接调用有什么区别?
- new一个类对象和使用类名创建一个对象有什么区别?LinkList和ArrayList的区别
- new一个类对象和使用类名创建一个对象有什么区别?该怎么解决
- URI,URL,herf,src 简述
- 剑指Offer--打印1到最大的n位数
- c++对象数组
- 输入数据有多组。 每组一行,为两个整数A, B。 输入以0 0结束。
- SPOJ - Horace and his primes(素数+二分查找)
- new 一个对象,用free去释放,会有什么问题
- 形态学图像处理(二)
- 深入理解Java内存模型的volatile语义
- 零基础学习java(七)
- 【解题报告】Codeforces Round #380 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 2)
- 数组排序+去重,看了那么多还是觉得这个简单。
- 《剑指offer》之数组专题
- 逻辑回归算法原理
- 2016年终畅想