- 浏览: 202744 次
- 性别:
- 来自: 重庆
文章分类
最新评论
我评价自己的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++的原子操作
2012-12-20 17:43 4658在多进程(线程)访问资源时,能够确保所有其他的进程(线程 ... -
匿名namespace的作用以及它与static的区别
2012-12-20 17:24 1771一。匿名namespace的作用 在C语言中,如果我们 ... -
C++类型萃取技术
2012-12-19 15:16 1116Traits技术可以用来获得一个 类型 的相关信息的。 ... -
数值压缩存储方法Varint
2012-12-19 14:35 817转自:http://www.cnblogs.com/smark ... -
TypeList
2012-12-19 13:49 1120转自:http://blog.csdn.n ... -
template <unsigned int N>
2012-12-19 11:51 1466详见:http://stackoverflow.com/ ... -
二维指针*(void **)的研究(uC/OS-II案例)
2012-12-19 22:20 3259原文 : http://blog.csdn ... -
多级指针和链表
2012-12-18 22:28 0如果看到一个声明:t ... -
理解*(void**)b
2012-12-18 22:03 0#include <stdio.h> ... -
STL标准库:Allocator能做什么
2012-12-18 20:10 0The Standard Librarian: Wha ... -
三种的allocator实现源代码的对比
2012-12-18 19:55 1286转自:http://blog.csdn.net ... -
结构体内变量相对便宜与list_entry()宏
2012-12-18 17:59 906#define list_entry(ptr, t ... -
声明与函数、函数指针---(*(void (*)( ) )0)( ) 解析
2012-12-18 17:33 1083概述 在很 ... -
c++模板(类型依赖)说明例子
2012-12-18 16:57 1131#include <iostream> # ... -
C++,永久改变你写异常安全代码的方式(神奇的Loki::ScopeGuard)
2012-12-17 20:19 2483作者:Andrei Alexandrescu and P ... -
C++的make_pair函数
2012-12-17 17:19 3435Pairs C++标准程序库中凡是“必须返回两 ... -
C++的explicit构造函数
2012-12-13 15:59 626按照默认规定,只有一个参数的构造函数也定义了一个隐式转换 ...
相关推荐
以下的是对c++中new的三种使用方法进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
本文档为word文档,主要介绍c++中new的用法,介绍详细,有具体代码分析,适合初学者理解,高手也值得一看!
。。。
。。。
有关于c++方面new和delete的用法及关注
virtual用法一 #include using namespace std; class A{ public: virtual void display(){ cout<<"A"<<ENDL>display(); delete p; } int main(int argc,char* argv[]) { doDisplay(new B()); return 0; ...
C++的new函数的用法,学习C++必备
1.异常和标准 C 对它的支持 2. Microsoft 对异常处理方法的扩展 3. 标准 C++异常处理的基本语法和语义 4. 实例剖析 EH 5. C++的 new 和 delete 操作时的异常处理 ...17. C++异常和 Visual C++ SEH 的混合使用
C++中new和delete的使用方法详解 new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new ...
C++ 中placement new 操作符使用方法 placement new操作符能够在分配内存时指定内存位置。下面的程序使用了placement new操作符和常规new操作符给对象分配内存。 // placenew.cpp -- new, placement new, no delete...
new用法: 1. 开辟单变量地址空间 1)new int; 开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5) 作用同上,但是同时将...
主要介绍了c++中try catch的用法小结,需要的朋友可以参考下
关于new和delete的详细用法。详细用法哟!new是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,
在C++语言中,有了一种新的注释方法,就是‘//’,在该行//后的所有说明都被编译器认为是注释,这种注释不能换行。C++中仍然保留了传统C语言的注释风格/*……*/。 C++也可采用格式化输出的方法: #include ...
全面地描述了C++专家所使用的高级技术,包括placement new、虚构造函数、智能指针、引用计数、代理类和双重分派等。 本书主要特点:以实例说明异常处理从结构上及行为上给C++类和函数带来的巨大影响。 从...
此实例解释了new动态创建多维数组的用法,还有包涵了多维数组指针的用法···
new用法: 1.开辟单变量地址空间1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a = new int(5) 作用同上,但是同时将...
【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林...18.1.1 C++中的内存分配 632 18.1.2 ...