当前位置:编程学习 > C/C++ >>

more effective c++笔记2-----Item M8:理 解各种不同含义的new和delete

一.说在前面的话

1.new operator是指: new 是一个操作符

2.operator new是指: new 操作符在进行内存分配时所调用的函数,通过这个函数来最终完成内存的分配,函数operator new 通常这样声明:void * operator new(size_t size),注意返回的是一个void*类型,但这个函数与普通函数又有些区别,他是一个重载操作符函数,类似于 bool Carrot::operator==(const Carrot& var)这样子.有关操作符重载点我

3.new[ ] operator 和 operator new[ ] 行为和上面一致,只不过这是为数组分配内存。

 

二. 摘录

当你写这样的代码:string *ps = new string("Memory Management");

你使用的new 是new operator。这个operator就象sizeof一样是语言内置的,你不能改变它的含义,它的功能总是一样的。它要完成的功能分成两部分。第一部分是分配足够的内存以便容纳所需类型的对象。第二部分是它调用构造函数初始化内存中的对象。new操作符总是做这两件事情,你不能以任何方式改变它的行为。new operator调用一个函数来完成必需的内存分配,你能够重写或重载这个函数来改变它的行为,new操作符为分配内存所调用函数的名字是operator new.

就象malloc一样,operator new的职责只是分配内存。它对构造函数一无所知。operator new所了解的是内存分配。把operator new 返回的未经处理的指针传递给一个对象是new操作符的工作。当你的编译器遇见这样的语句:


string *ps = new string("Memory Management");
这句代码或多或少与下面的代码相似:

void *memory = operator new(sizeof(string)); // 得到未经处理的内存为String对象
call string::string("Memory Management") // 初始化 *memory内存中的对象
string *ps = static_cast<string*>(memory); // 是ps指针指向新的对象

三.演示程序:

// 自己定制 operator new 和 operator delete 函数,实现比较简陋.
void* operator new(size_t size)
{
 void* p = NULL;
 p = malloc(size);
 return p;
}

void operator delete(void* ptr)
{
 free(ptr);  // 内存释放
}
// 自己定制 operator new[] 和 operator delete[] 函数,实现和上面是一致的
void* operator new[](size_t size)
{
 void* p = NULL;
 p = malloc(size);
 return p;
}
void operator delete[](void* ptr)
{
 // 内存释放
 free(ptr);
}
int _tmain(int argc, _TCHAR* argv[])
{

 char* buffer1 = new char[100]; // 自动调用 operator new(100),
 delete[] buffer1;    // 自动调用 operator delete(buffer2)


 // 下面这段代码会自动调用 operator new(sizeof(type))函数, 同时还会进入string对象的构造函数.
 // 同时这也验证了new operator的2个固定作用:自动调用operator new函数和对象的构造函数。
 // delete operator 除了释放分配的内存以为还会调用string对象的析构函数.
 string* buffer2 = new string("hello world");
 delete buffer2;        
            

 // 直接调用operator new函数,如果有定制则进入定制的operator new函数
 void* buffer3 = operator new(10);
 operator delete(buffer3); 

 // 题外话
 // 1.下面段代码除了分配20个字节内存外,还会进入一段汇编代码将这段内存内容全部置为0
 // 1.和memset(buffer4,0,20)同样的作用,我个人尤其偏爱这样写 :)
 char* buffer4 = new char[20]();
 delete[] buffer4;

 return 0;
}

 

三.总结
你想在heap(堆)上建立一个对象,应该用new operator,它既分配内存又为对象调用构造函数。如果你仅仅想分配内存,就应该调用operator new函数,它不会调用构造函数,如果你想定制自己的在heap对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new(这句话的意思是:如果你定制了自己的operator new 函数(全局),当我们使用new operator时,系统会自动去调用你定制operator new 函数来分配内存,否则将调用默认的operator new函数),如果你想在一块已经获得指针的内存里建立一个对象,应该用placement new(关于 placement new的知识请查阅原文)。

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,