1

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

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

然后分配 withfoo* 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

4

2 回答 2

0

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

于 2020-04-12T13:35:48.590 回答
0

不,按照标准规则是不可能的。C++ 中根本不允许使用可变长度数组和灵活数组成员,例如您在示例中显示的。也没有等效或替代方案。

此外,malloc根本不能用于在 C++ 中创建对象。只有new给它正确的类型才能动态创建该类型的对象。如果假装创建了给定类型的对象,则其他所有内容都是不允许的,并且会导致未定义的行为。

由于 C++20 对于某些类型的对象,上述规则有一些例外,这些对象可以隐式创建,但是,对象的大小在编译时由其类型固定,根本不能改变。

为一个对象过度分配永远不会导致额外的存储成为对象的一部分,并且永远不允许像访问它一样访问它。

于 2020-04-12T13:26:01.983 回答