C++free释放问题

#include <iostream>
using namespace std;
#include <cstdlib>

class Bug{
public:
Bug(){cout<<"bug " << this << " created" << endl;} //bug是类 this不是指当前对象吗???????
~Bug(){cout<<"bug " << this << " destoryed" << endl;}
};
int main()
{
Bug* p1 = new Bug;
//Bug* p2 = static_cast<Bug*>(malloc(sizeof(Bug)));
Bug* p3 = new Bug[3];
for(int i=0; i<4; i++)
cout << *((int*)p3-i) << endl;
free(p1); //free无法释放对象?只能释放一次吗????
delete[] p3; // [ ]里存着3 上面用一个循环会出现0 3 17 为什么会有17呢????
}

free函数是由C语言继承而来的,是和malloc配对的,而不能和new配对。
free释放内存的和delete可以说是两套代码,它们的逻辑不同,不能混用。用new申请的就要用delete翻译,用malloc申请的就要用free释放。
顺便说一下它们还有一个区别, free 只是告诉操作系统回收内存,而delete会先调用类的析构函数,然后才告诉操作系统回收内存。追问

//bug是类 this不是指当前对象吗???????

追答

this 指当前对象的指针。那个打印语句是有问题的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-13
我都不知是我不懂还是你高明;
那个*((int*)p3-i),你究竟想输出什么;输出0 3是你预料到的吗?
free又不会调用你的析构函数,当然没输出;而且这是对应malloc的,你又没用malloc

C++free释放问题
free函数是由C语言继承而来的,是和malloc配对的,而不能和new配对。free释放内存的和delete可以说是两套代码,它们的逻辑不同,不能混用。用new申请的就要用delete翻译,用malloc申请的就要用free释放。顺便说一下它们还有一个区别, free 只是告诉操作系统回收内存,而delete会先调用类的析构函数,然后...

C++中,free函数为什么会报错?
如果是编译错误,则表明没有包括头文件cstdlib 如果是运行错误,则表示free函数参数的指针值有错误,主要如下:1、指向目标并不是可以释放的空间 2、指向目标已经释放过了,现在重复释放 3、指针值为0 4、不是原来动态分配空间的首地址 具体情况还得看看代码才行 ...

c++\/mfc 程序 打包运行一段时间后 报错 如图
void Release() throw(){ATLASSERT( nRefs != 0 );if( _AtlInterlockedDecrement( &nRefs ) <= 0 ){pStringMgr->Free( this );}}以上是错误位置代码,可以看出,是在字符串释放内存的时候出现的问题,其它的就没法分析出来了,还是要调试和分析程序 ...

c\\c++里关于free()函数的小疑惑。。。
1。连后面也释放了 因为你对这块空间的访问是通过首地址给指针变量a来实现的,释放a后,你也就没法访问这块空间了 2。是不一样的 动态分配存储空间是分配在SDRAM上,程序读入也是在SDRAM上,就是我们通常所说的内存,区别是动态分配存储空间在内存的数据段,而程序放在内存的代码段 而静态RAM,是通常...

C++ free释放问题
这种情况是例外的,如果对象列表中存放的是对象指针,不是对象本身的话,在释放列表时,需要对象的一个一个释放。而不是将指针清空。

C++中new申请的内存,可以用free释放吗
可以,但不安全,通过 free 调用释放 new 申请的内存并不总是能正确的释放所有申请的内存。因为使用 free 方法释放内存时并不会调用实例的析构函数,此时如果实例中有动态申请的内存将因为析构函数没有被调用而没有得到释放,从而导致内存泄漏。而通常你不一定总能知道该类中是否使用了动态内存,因此最佳...

c++的“free”
书上怎么能这么教人呢。free以后就不能再用这块内存。因为说不定它又被分给其他变量用。那就全乱了,而且不好查错。实际应用中这种写法是大忌,所以讨论这样的输出结果是没有意义的。记住free一定要放到最后!还有每次最好free后清零。free(str);str=NULL;...

C++ free()
delete是释放new开辟的内存。new和delete 开辟再堆中内存时候会调用构造函数和析构函数 malloc和free不会调用。free释放内存,并不是真正意义上的把那块内存清空了,他只是告诉操作系统这块内存可以被再次使用,如果操作系统以后用这块内存的话就会把上面的数据覆盖掉。malloc多大内存就要用free多大内存。

C++中,free函数为什么会报错?
C++ 中应当使用new和delete 来分配、销毁堆内存。如果使用new创建 则必须使用delete销毁。当然也可以使用malloc\/free 来做。部分编译器会对多次delete或者free 报错,但是对于gcc而言:free和delete的对错误对象使用是会被接受的(这么做的原因是由于 编译器不知道指针指向的到底是什么,也不知道某些已编译的...

c语言中free释放了一个结构体,但是它里面的指针却依然可以访问?_百度...
free函数,实际上做的事情不是真正的释放内存。首先你要清楚,内存是由操作系统来管理的(操作包括分配、释放等)。系统中的内存在c语言分配内存机制上被分为很多个块,c的底层代码用数据结构chunk来表示。chunk中有一个标志位,用来表示该内存块是否为待分配或者已分配状态。每一次调用malloc,这个标志位...

相似回答