`

C++中的placement new--在指定位置调用某类的构造函数

    博客分类:
  • C++
 
阅读更多
先贴上参考资料的网址:
1、http://www.builder.com.cn/2008/0104/696370.shtml
2、http://c.chinaitlab.com/basic/783582_2.html

感觉自己用的话不需要重载new运算符,毕竟都是要分配内存,调用构造函数。。自己做内存管理直接申请一块大内存用placement new创建对象就好了。
另外,明白了delete与delete[] 的区别在于delete[]回收内存前还会逐个调用析构函数,因而对于简单类型等无需析构的两者没啥区别。


#pragma  once
#include "iostream"
//#include <new.h>

using namespace std;

class A
{
public:
	int a;
	int* pInt;
	A(){
		pInt=new int[10];
	}


	A(int a):a(a){
		pInt=new int[10];
	}

	~A(){
		cout<<"A的析构函数!!a="<<a<<";\tpInt="<<(long long)pInt<<endl;
		if(pInt!=NULL)
		{
				delete[] pInt;
				pInt=NULL;
		}
	}


// 	void* operator new(size_t size)
// 	{
// 		cout<<"operator new called"<<endl;;
// 		return ::operator new(size);
// 	}

// 	void* operator new(size_t /*省略名称以防编译器警告*/,void* location=(void*)0){//placement new ,如 new(p) A(3); //p->A::A(3);   //必须#include <new>
// 		cout<<"placement new called"<<endl;
// 		return location;
// 	}

};

// void* operator new(size_t size)
// {
// 	cout<<"global new"<<endl;
// 	return malloc(size);
// }


void main(){
	//A* a = new A();
	A a(1);

	char* s=new char[sizeof(A)];
	A* p = (A*)s;
	cout<<"before 'new(p) A(2);' p->a =  "<<p->a<<";\tpInt="<<(long long)p->pInt<<endl;
	new(p) A(2); //p->A::A(2);  //placement new!!!!!!!!!!
	cout<<"after 'new(p) A(2);' p->a =  "<<p->a<<";\tpInt="<<(long long)p->pInt<<endl;
	//p->~A();//需要手动调用析构函数!!!


	cout<<"\n******************    test2"<<endl;
	char* s2=new char[sizeof(A)];
	A* p2 = (A*)s2;
	cout<<"before 'p2->A::A(3);' p2->a =  "<<p2->a<<";\tpInt="<<(long long)p2->pInt<<endl;
	p2->A::A(3);//placement new!!!!!!!!!!   的第二种写法
	cout<<"after 'p2->A::A(3);' p2->a =  "<<p2->a<<";\tpInt="<<(long long)p2->pInt<<endl;
//	p2->~A();


	delete[] s;//编译器不知道s中的内容是类A啊,不调用析构函数
	delete[] s2;

	//测试数组
// 	cout<<"\n\\\\\\\\\\\\*****测试数组"<<endl;
// 	A* aa=new A[10];
// 	delete[] aa;

	cout<<"\n******************   从main函数返回前的最后一句"<<endl;
}


输出如下:

  • 大小: 34.6 KB
分享到:
评论

相关推荐

    placement new详解

    由于它跳过了内存分配的过程,直接在指定的内存位置上执行构造函数,因此可以避免内存分配带来的开销,提高程序的执行效率。 #### new、operator new与placement new的区别 - **new**:这是最常用的对象创建方式,...

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

    new 的过程可以分为三步:获得一块内存空间、调用构造函数、返回正确的指针。在 C++ 中,new 可以分为三种形态:new operator、operator new、placement new。 new operator new operator 是我们平时所使用的 new...

    全面解析C++中的new,operator new与placement new

    在这个例子中,`new X`首先会调用`operator new`为`X`类的实例分配足够的内存,然后调用`X`的默认构造函数来初始化对象。`new`操作符不能被重载,以确保它始终遵循标准的行为。 然而,`operator new`是一个可以被...

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

    这是最常见的`new`使用方式,它负责分配内存并调用构造函数来初始化对象。如果分配失败,`plain new`会抛出一个`std::bad_alloc`异常。例如: ```cpp void* operator new(std::size_t) throw(std::bad_alloc); ...

    深入C++的new关键字

    当使用new关键字在堆上动态创建一个对象时,new实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。如果创建的是简单类型的变量,那么第二步会被省略。 3. new的三种形态 new可以分为三种形态:...

    关于new和delete的详细用法

    它可以用于在堆上动态创建一个对象,实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。 2. new的三种形态:new operator、operator new、placement new。new operator是我们平时所使用的new,其...

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

    placement new 会在已经申请好的内存中调用构造函数来初始化对象。 delete 语句 与 new 对应的 delete 语句也只有两种,分别是 delete 表达式和 operator delete。delete 表达式会调用对象的析构函数和释放内存,而...

    深入C++基础_new运算符.doc

    `new`操作符在C++中扮演着重要角色,它不仅提供了动态内存分配的能力,还允许开发者通过重载`operator new`和`placement new`等方式来定制内存管理和对象构造的过程。掌握这些细节有助于编写更加高效和安全的C++程序...

    C++new运算符[参考].pdf

    new 运算符是 C++ 中最常用的 new,它作为运算符,用于在堆上分配一块内存,并自动调用类的构造函数。例如: ```c string *str = new string("test new"); ``` new 函数 new 函数是 C++ 中的另一种 new,用法是:...

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

    在C++编程语言中,`new`关键字有三种主要的使用方法,这些方法可以被归类为两大类:new表达式和new操作符。每种用法都有其特定的用途和场景,对于理解和掌握C++内存管理至关重要。 首先,我们来看最常用的**new...

    kei开发ARM实现构造函数测完整工程试.zip

    在本项目"kei开发ARM实现构造函数测完整工程试.zip"中,我们将关注如何在基于ARM架构的平台上进行软件开发,特别是关于C++中的构造函数测试。 构造函数是C++编程中的一个重要概念,它是类的一个特殊成员函数,用于...

    C++_new_operator详解

    通过上述分析可以看出,`new`操作符及其相关的`operator new`和`placement new`在C++中扮演着重要角色。它们提供了灵活的内存管理机制,但也要求程序员正确地管理和释放内存,以避免内存泄漏和其他潜在的问题。理解...

    C++构造函数深度学习

    总结一下,C++构造函数的深度学习涉及到对构造函数互相调用的理解,以及如何有效地利用placement new和委托构造函数来简化代码和提高效率。掌握这些技巧对于编写高效、可维护的C++代码至关重要。在实际编程中,根据...

    详解C++中如何将构造函数或析构函数的访问权限定为private

    在C++编程语言中,将构造函数或析构函数的访问权限设置为private是一种常见的设计模式,通常用于实现单例模式或者控制对象的创建和销毁。单例模式确保一个类在整个程序运行期间只存在一个实例。下面我们将详细探讨这...

    c语言newC++的new[收集].pdf

    - **`placement new`**:用于在已经分配好的内存上进行对象构造,不负责分配内存,只执行第二步(调用构造函数)。通常配合 `char[]` 或其他已知内存区域使用。 5. **`operator new` 和 `operator delete` 重载** ...

    C与C++中的异常处理

    在C++中,自动删除机制和placement new/delete是处理动态分配对象生命周期的关键。当使用类属new和delete操作符时,可以为不同的对象类型定制不同的分配和释放策略。而placement new则允许在已分配的内存上构造对象...

    C_与C++中的异常处理.pdf

    #### 九、placement new和placement delete,及处理构造函数抛出的异常 ##### 9.1 构造函数异常处理 当构造函数抛出异常时,可能会留下部分构造的对象。Placement new和placement delete可以用来处理这种情况,确保...

    c,c++异常处理

    深入讨论了placement new和delete的使用场景,以及如何处理构造函数抛出的异常。 - **placement new**: 介绍了placement new的操作原理及其应用场景。 - **处理构造函数异常**: 如何处理构造函数中可能抛出的异常。...

Global site tag (gtag.js) - Google Analytics