【发布时间】:2015-01-23 08:54:11
【问题描述】:
您好,我读到 new 和 delete 比 malloc() 和 free() 更好,因为 free() 不会调用析构函数,而 delete 会...
例如:
#include <iostream>
using namespace std;
class String
{
public:
String();
String(const String&){cout<<"String cpy ctor\n";}
~String();
private:
int* itsParray;
};
String::String()
{
cout<<"String ctor\n";
itsParray=new int[100];
for(int i(0);i<100;i++)
itsParray[i]=i+1;
}
String::~String()
{
cout<<"String dtor\n";
delete[] itsParray;
itsParray=NULL;
}
int main()
{
String* pStr=NULL;
pStr = static_cast<String* > (malloc(4 * sizeof(String)));
free(pStr);
pStr=new String[4];
delete[] pStr;
cout<<endl<<endl<<endl;
return 0;
}
当我执行程序时,我看到在pStr 上调用delete 时调用了四个String 对象的析构函数。但是free() 删除的四个不调用析构函数。这是否意味着free()只要类内部的堆上有指针就会导致内存泄漏?
【问题讨论】:
-
我猜你的意思是“新建并删除”。
-
malloc和free都是 C 函数,而不是 C++ 函数。你不应该在 C++ 代码中使用它们,除非你实际上是在为 C 库分配东西——在这种情况下,new和delete应该可以正常工作。 -
这意味着应该调用的析构函数不是。这可能导致未定义的行为。另外,不要专注于内存泄漏。类可以管理非内存资源。
-
另外,
free()不会导致内存泄漏,在 C++ 代码中使用free()的糟糕程序员会这样做。 -
不仅
free不会调用对象的析构函数,而且malloc也不会调用对象的构造函数。
标签: c++