理解placement new的使用

-- TOC --

placement这个词有一条英文解释为:the act of putting something in a certain place。这样就可以理解,placement new就是从一个特定的地址获取内存空间。

阅读C++代码,看到placement new的语法,当时是真心不理解这些奇奇怪怪的字符串是什么意思....

void* operator new(size_t, void*);
void operator delete(size_t, void*);
void* operator new[](void*, void*);
void operator delete[](void*, void*);

Using placement operators, you can manually construct objects in arbitrary memory. This has the advantage of enabling you to manually manipulate an object’s lifetime. However, you cannot use delete to release the resulting dynamic objects. You must call the object’s destructor directly (and exactly once!)

又出现一个新词:placement operator!

#include <cstdio>
#include <cstddef>
#include <new>


struct xyz {
    int a;
};


int main(void) {
    const auto psize = sizeof(xyz);
    std::byte place[psize * 3];
    auto p1 = new(&place[0*psize]) xyz{1};
    auto p2 = new(&place[1*psize]) xyz{2};
    auto p3 = new(&place[2*psize]) xyz{3};
    printf("%d %d %d\n", p1->a, p2->a, p3->a);
    p1->~xyz();
    p2->~xyz();
    p3->~xyz();
    //printf("%d %d %d\n", p1->a, p2->a, p3->a); // warning
    return 0;
}

使用placement new,需要引用<new>这个头文件。(std::byte<cstddef>中)

这段代码逻辑,在指定的内存位置(在stack中),创建3个xyz对象。

stack空间是不需要专门delete的,因此上面的测试代码,不需要使用delete!代码显式地调用对象的destructor,因为xyz只是POD,这个destructor是编译器自动提供的(这里只是示例)。

new(和delete)不是函数调用,而是运算符,因此表达式的语法规则,就是运算符特有的规则。

本文链接:https://cs.pynote.net/sf/c/cpp/202209022/

-- EOF --

-- MORE --