gpt4 book ai didi

c++ - placement-new 上的析构函数

转载 作者:行者123 更新时间:2023-11-30 01:36:00 30 4
gpt4 key购买 nike

是否有一种模式可以在退出范围时自动调用堆栈上 placement-new 初始化对象的析构函数?我想跳过内存显式调用析构函数的需要。或者,是否有一种不同于 placement-new 的方法来构建具有可变大小 data[] 尾部的基于堆栈的对象?我使用 g++。

/* g++ f.cpp -o f.exe */
/* 8< --- f.cpp ---- */
#include <stdio.h>
#include <stdlib.h>
#include <string>
class aclass {
public:
aclass(int size) : size_(size) {};
~aclass() { /* do something */ };
int size_;
char data[0];
};

void f(int size)
{
char v[sizeof(aclass) + size];
aclass *p = new(static_cast<void*>(&v)) aclass(size);
p->~aclass();
}

int main(int argc, char **argv)
{
f(10);
f(100);
return 0;
}

最佳答案

您可以像这样创建一个包装类:

template <typename T>
class Foo {
private:
T *m_ptr;
public:
Foo(void *area, int size) {
m_ptr = new(area) T(size);
}
Foo(const Foo &) = delete;
~Foo() {
m_ptr->~T();
}

void operator=(const Foo &) = delete;

T *operator->() {
return m_ptr;
}
};

用法:

void f(int size) {
char v[sizeof(aclass)+size];
Foo<aclass> p(v, size);

p->doSomething(); // call a function from aclass
}

请注意,您使用的是 GCC 扩展,因为 size 不是编译时常量。

如果它是一个编译时常量,那么你可以将 v 放入 Foo(并且 size 将是一个模板参数),所以 f 会更简单。

关于c++ - placement-new 上的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52681624/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com