`
jfwang213
  • 浏览: 10740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

cpp不申请内存,而调用类的构造函数-placement new

阅读更多

placement new

为了稳定和简单,负责在线应用的程序很少使用动态内存,所以很多基本库都是基于静态内存。

比如一个hash的接口是void *GetObjectByKey(uint32_t dwKey);

GetObjectByKey调用后返回了一段内存。如果你想在这段内存上放置一个类,那怎么办呢?

class A
{
public:
....
private:
...
};

 一种办法是:

A *pA = GetObjectByKey(dwKey);

 这种办法的问题是,没有调用A的构造函数,这是非常危险的,因为pA的对象并没有初始化。

这时就可以使用placement new来解决这个问题:

A *pA=new (GetObjectByKey(dwKey)) A();

 

placement delete

 

placement delete和placement new是一一对应的。使用placement new构造的对象,怎样析构呢?

c++是没有提供placement delete的。即是不能通过delete操作符完成的。正确的做法为:

pA->~A();
 
1
1
分享到:
评论

相关推荐

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

    operator new 只申请内存,而不调用构造函数来初始化对象。 placement new placement new 是 C++ 中的第三种 new 使用方法,它用于在给定的内存中初始化对象。例如: ```cpp void* buffer = operator new(sizeof...

    全面解析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); ...

    new操作符(new operator)和operator new的区别

    2. 初始化对象:分配完内存后,`new`操作符会调用对应的构造函数来初始化新创建的对象。 `operator new`是一个可重载的全局函数,其基本形式为`void* operator new(size_t size)`。它的职责仅仅是分配指定大小的...

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

    2. **调用构造函数**:一旦分配了足够的内存,`new`会调用相应类型的构造函数来初始化新分配的内存区域。 3. **返回指针**:最后,`new`返回一个指向已分配内存的指针,该指针通常被赋予一个合适的类型。 例如,...

    C++_new_operator详解

    - 调用对象的构造函数初始化这个内存块。 例如: ```cpp CTest *pT = new CTest(1, 2); ``` 等同于: ```cpp void *p = operator new(sizeof(CTest)); CTest *pT = new(p) CTest(1, 2); ``` 这里`operator new...

    关于析构函数和临时对象的问题

    每次创建临时对象时,都会调用构造函数,而当临时对象不再需要时,会调用析构函数。因此,每个数组元素的初始化过程中都涉及到一个临时对象的创建和销毁,总共产生了三个临时对象,每个临时对象的析构函数都被调用一...

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

    它包括了对象的构造过程,因此在内存分配后会自动调用构造函数。 其次,是**new操作符**,它仅负责内存的分配,不涉及对象的初始化。这与C语言中的`malloc`类似,但`new`操作符通常更安全,因为它会处理对齐和异常...

    C++构造函数深度学习

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

    expclass_src.zip

    动态调用DLL(Dynamic Link Library)导出类是Windows编程中一种常见的技术,它允许程序在运行时加载和使用库中的特定功能,而无需在编译时就将这些功能硬编码到应用程序中。这种方式提供了更高的灵活性,使得软件...

    重载new 用法例子

    7. **使用placement new**:有时,我们可能需要在已经分配好的内存上构造对象,这时可以使用放置new(placement new)。它不会分配新的内存,而是允许在指定的地址上创建对象。 8. **自定义分配器**:除了全局重载...

    Bjarne Stroustrup的FAQ

    - 在构造函数中调用虚函数可能导致未定义的行为,因为此时对象尚未完全构造完毕。 - 可以考虑在构造函数完成后,通过初始化列表或构造后的方法调用来间接调用虚函数。 - **“指定位置删除”(Placement Delete)的...

    浅析C++ new的三种面貌

    它接收一个已经存在的内存地址`__p`,然后在该地址上调用对象的构造函数。 使用`placement new()`的一个典型场景是,当你有一个已知的内存块(可能是通过`malloc`或`calloc`获取的),你可以使用`placement new()...

    C++编程中new运算符的使用学习教程

    对于类类型,`new`运算符不仅分配内存,还会调用对象的构造函数。在例子中,类`CName`的实例化: ```cpp CName *pName = new CName; ``` `CName`的默认构造函数会被调用。如果类有默认构造函数,即使未提供初始值...

    C++11容器emplace源码剖析

    2. 使用placement new在新分配的内存位置上直接调用元素类型的构造函数,传入`emplace_back`的参数。 3. 更新容器的大小指示器。 这个过程比`push_back`更有效,因为它省去了创建临时对象和随后的拷贝或移动操作。 ...

    C与C++中的异常处理

    在使用`placement new`时,如果构造函数抛出异常,必须手动调用`placement delete`来释放已分配的内存,而不是普通的`delete`,后者会试图调用未定义的析构函数。 #### 从私有子对象中产生的异常 在具有多个成员...

    Bjarne Stroustrup的FAQ:C++的风格与技巧

    构造函数不能是虚函数,因为构造函数的目的在于初始化对象,而在对象创建之前,无法确定应该调用哪个构造函数。虚构造函数会导致构造过程变得不确定,不符合面向对象的设计原则。 ##### (8) 为什么重载在继承类中不...

    实例代码分析c++动态分配

    对于复杂类型,除了内存分配,还会调用构造函数和析构函数。`operator new`内部通常会调用`malloc`,`operator delete`对应`free`。 4. **new[]/delete[]的底层实现** `new[]`和`delete[]`处理数组分配。对于简单...

    网易笔试题2010

    - **只调用构造函数而不分配内存**: - 可以使用placement new语法。 - 示例代码: ```cpp void* memory = malloc(sizeof(A)); new (memory) A(); ``` - **用途**: - 用于手动管理内存时,比如自定义内存池...

Global site tag (gtag.js) - Google Analytics