转载自 new和detele
和sizeof类似,new 和 delete也不是函数,比如new和c中的malloc函数不同的是,string *ps = new string("hello world");
malloc申请完了之后不会对内存进行必要的初始化,但是new可以。
operator new 和 operator delete
这两个其实是 C++ 语言标准库的库函数,原型分别如下:
void *operator new(size_t); //allocate an object
void *operator delete(void *); //free an objectvoid *operator new; //allocate an array
void *operator delete[](void *); //free an array
后面两个你可以先不看,后面再介绍。前面两个均是 C++ 标准库函数,你可能会觉得这是函数吗?请不要怀疑,这就是函数!C++ Primer 一书上说这不是重载 new 和 delete 表达式(如 operator= 就是重载 = 操作符),因为 new 和 delete 是不允许重载的。但我还没搞清楚为什么要用 operator new 和 operator delete 来命名,比较费解。我们只要知道它们的意思就可以了,这两个函数和 C 语言中的 malloc 和 free 函数有点像了,都是用来申请和释放内存的,并且 operator new 申请内存之后不对内存进行初始化,直接返回申请内存的指针。
我们可以直接在我们的程序中使用这几个函数。
new 和 delete背后的机制
用一个实例来解释 new 和 delete 背后的机制:
class A
{
public:
A(int v) : var(v)
{
fopen_s(&file, "test", "r");
}
~A()
{
fclose(file);
}private:
int var;
FILE *file;
};
A类中有两个成员var file,一个构造函数一个析构函数,析构函数中初始化私有变量var以及打开一个文件,析构函数关闭打开的文件。
使用语句
class *pA = new A(10);
来创建一个类的对象,返回其指针pA。new背后完成的工作包括:
1.调用operator new标准库函数来分配足够大的原始的未类型化的内存
2.运行该类型的相对应的构造函数。在上一步的内存基础上进行初始化对象。
3.返回指向新分配并构造的对象的指针。
申请和释放一个数组
申请数组可以这样
string &psa = new string[10];
int *pia = new int[10];
释放数组可以使用:
delete [] psa
delete [] pia
在释放数组时[]不可以漏掉。
网友评论