`

C++中三种new的用法

    博客分类:
  • c++
 
阅读更多

我评价自己的C++水平还未入门的确不够准确,应该是远远未入门。

感叹自己看书的时候如此粗心,C++Coder最基本的placement new的知识,今天才明白。

 

如何在new一个对象的时候,使对象的空间并不在堆上分配,而是由使用者传入一个缓冲区给对象使用,且编译期会自动调用对象的构造函数?

 

new这个C++头文件中(注意,是new,不是new.h),定义了一个全局的重载了的new操作符,可以达到上述的效果。看看我写的测试代码:

//------------------------------------------------------------------------

//test_new.cpp

// g++ -o test_new test_new.cpp -Wall -Werror

#include <stdio.h>

#include <new>

 

class MyClass

{

public:

MyClass()

{

printf("constructor, %s %d\n", __FILE__, __LINE__);

}

 

~MyClass()

{

printf("destructor, %s %d\n", __FILE__, __LINE__);

}

private:

MyClass(const MyClass& rsh);

MyClass& operator=(const MyClass& rsh);

};

 

void test()

{

char buf[10];

MyClass* p = new (buf)MyClass;  // 构造函数被调用了

printf("buf=%08X, p=%08X\n", (unsigned int)buf, (unsigned int)p);  //发现对象的地址和缓冲区的地址是一致的

//delete p;  //不能调用delete,因为没有placement delete

}

 

int main()

{

test();

return 1;

}

//----------------------------------------------------------

 

当然,指定缓冲区的方式构造了对象,是不需要管理空间释放的工作的。

可是,如何只调用析构函数,而又不删除空间呢?

可以手动调用析构函数来实现:

p->~MyClass();

 

 

 

虽然有三种new的用法其一是new operator,也叫new表达式;其二是operator new,也叫new操作符。这两个英文名称起的也太绝了,很容易搞混,那就记中文名称吧。new表达式比较常见,也最常用,例如:

string* ps = new string("abc");

上面这个new表达式完成了两件事情:申请内存和初始化对象。

new操作符类似于C语 言中的malloc,只是负责申请内存,例如:

void* buffer = operator new(sizeof(string));

注 意这里多了一个operator。这是new的第二个用法,也算比较常见吧。

那么第三个用法就不很常见了,官方的说法是placement new,它用于在给定的内存中初始化对象,也就是说你手中已有一块闲置的内存,例如:

void* buffer = operator new(sizeof(string));//那么现在buffer是你所拥有闲置内存的指针

buffer = new(buffer) string("abc"); //调用了placement new,在buffer所指向的内存中初始化string类型的对象,初始值是"abc"

事实上,placement new也是new表达式的一种,但是比普通的new表达式多了一个参数,当然完成的操作和返回值也不同。

因此上面new的第一种用法可以分解两个 动作,分别为后面的两种用法。

与new对应的delete没有三种语法,它只有两种,分别是delete operator和operator delete,也称为delete表达式和delete操作符。delete表达式和new表达式对应,完成对象的析构和内存的释放操作。而delete 操作符只是用于内存的释放,和C语言中的free相似。例如:

 

string* ps = new string("abc");
...
delete ps; //调用delete表达式,先析构再释放
void* buffer = operator new(sizeof(string));
...
operator delete(buffer); //释放

那么为什么没有和 placement new对应的那个delete呢?其实是有的。placement new是在指定位置初始化对象,也就是调用了构造函数,因此与之对应的就是析构函数了,只不过它不叫placement delete而已。

 

 

void *pv = operator new(sizeof(vector<int>));
pv = new(pv) vector<int>(8, 0);
...
static_cast<vector<int>* >(pv)->~vector(); // call destruct function
operator delete(pv); // free memory
pv = NULL;
分享到:
评论

相关推荐

    c++中new的三种用法详细解析

    以下的是对c++中new的三种使用方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    c语言中new_C++的new归纳详解

    本文档为word文档,主要介绍c++中new的用法,介绍详细,有具体代码分析,适合初学者理解,高手也值得一看!

    总结C++中三种关于new的使用方法.pdf

    。。。

    总结C++中三种关于new的使用方法.docx

    。。。

    c++语言,new和delete

    有关于c++方面new和delete的用法及关注

    浅谈C++中virtual的三种用法

    virtual用法一 #include using namespace std; class A{ public: virtual void display(){ cout&lt;&lt;"A"&lt;&lt;ENDL&gt;display(); delete p; } int main(int argc,char* argv[]) { doDisplay(new B()); return 0; ...

    C++new 用法

    C++的new函数的用法,学习C++必备

    C和C++中的异常处理

    1.异常和标准 C 对它的支持 2. Microsoft 对异常处理方法的扩展 3. 标准 C++异常处理的基本语法和语义 4. 实例剖析 EH 5. C++的 new 和 delete 操作时的异常处理 ...17. C++异常和 Visual C++ SEH 的混合使用

    C++中new和delete的使用方法详解

    C++中new和delete的使用方法详解 new和delete运算符用于动态分配和撤销内存的运算符 new用法:  1. 开辟单变量地址空间  1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new ...

    C++ 中placement new 操作符使用方法

    C++ 中placement new 操作符使用方法 placement new操作符能够在分配内存时指定内存位置。下面的程序使用了placement new操作符和常规new操作符给对象分配内存。 // placenew.cpp -- new, placement new, no delete...

    c++中new和delete操作符用法

    new用法: 1. 开辟单变量地址空间 1)new int; 开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.  2)int *a = new int(5) 作用同上,但是同时将...

    c++中try catch的用法小结

    主要介绍了c++中try catch的用法小结,需要的朋友可以参考下

    关于new和delete的详细用法

    关于new和delete的详细用法。详细用法哟!new是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,

    新手学习C++入门资料

    在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中仍然保留了传统C语言的注释风格/*……*/。 C++也可采用格式化输出的方法: #include ...

    More Effective C++.pdf 高清 目录

     全面地描述了C++专家所使用的高级技术,包括placement new、虚构造函数、智能指针、引用计数、代理类和双重分派等。  本书主要特点:以实例说明异常处理从结构上及行为上给C++类和函数带来的巨大影响。  从...

    C++动态创建多维数组

    此实例解释了new动态创建多维数组的用法,还有包涵了多维数组指针的用法···

    浅析c++中new和delete的用法

    new用法: 1.开辟单变量地址空间1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.  2)int *a = new int(5) 作用同上,但是同时将...

    C++ Primer第四版【中文高清扫描版】.pdf

    【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林...18.1.1 C++中的内存分配 632 18.1.2 ...

Global site tag (gtag.js) - Google Analytics