c++ - 具有多态性的类中灵活的数组成员

标签 c++ c++11 polymorphism flexible-array-member

在 C99 中你可以有类似的东西

struct foo
{
    int a;
    int data[];
}; 

然后分配foo* f=(foo*)malloc(sizeof(foo)+n)拥有一个数组长度为 n 的结构体.

当类是具有虚函数的子类时,可以在 C++ 中执行类似的操作吗?

喜欢foo作为 bar 的子类,然后执行类似 std::unique_ptr<bar> f= std::unique_ptr<foo>((foo*)malloc(sizeof(foo)+n)) 的操作

我知道该代码不起作用,因为释放内存可以通过delete来完成。但分配是通过 malloc 完成的

最佳答案

变长数组实际上并不是 C++ 标准的一部分,而是编译器扩展。但是,如果您确实想使用它们,我的意思是,使用 malloc 分配对象,您将需要使用 placement new调用构造函数,并在调用free之前手动调用析构函数(应该是虚拟的),例如f->~bar()。由于 malloc 会生成一个指向对象初始化所需大小的内存的指针,因此这不应产生未定义的行为。

关于c++ - 具有多态性的类中灵活的数组成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61172086/

相关文章:

delphi - 如何将多个不同的记录(由于delphi限制而不是类)传递给一个函数?

fortran - 指向父类的多态指针不起作用

c++ - C++ 中 bool 函数没有引用参数?

c++ - 我怎么知道哪些库被动态链接到静态库中?

c++ - printf 调用搞砸了 std::thread 但 std::cout 很好

c++ - 推导类型

c++ - 如何从派生类实例化基类中的数组?

C++ 标准正则表达式问号问题

c++ - 使用外部模板时出现链接器错误

c++ - 在 C++ 中定义虚拟 get 和 set 函数被认为是一种好的做法吗?