gpt4 book ai didi

c++ - 调用struct的虚函数时出现段错误

转载 作者:行者123 更新时间:2023-11-28 02:02:23 25 4
gpt4 key购买 nike

我在下面有一个 C++ 代码,它创建了一个指向结构的指针数组

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#define WATCH(x) std::cout << #x << ": " << x << std::endl;

typedef struct
{
double thickness;
char name[80];
virtual double getDensity() const {return 0.1;}
} mat_prop_t;

struct mat_el_prop : public mat_prop_t
{
double density;
double young;
double poisson;
virtual double getDensity() const {return density;}
};

int main(int argc, char** argv)
{
mat_prop_t** mat_prop;
mat_prop = (mat_prop_t**) calloc(1, sizeof(mat_prop_t*));
mat_prop[0] = (mat_prop_t*) calloc(1, sizeof(mat_el_prop));
mat_el_prop* mat1 = (mat_el_prop*) mat_prop[0];
mat1->density = 2.038735;
mat1->young = 2.0;
mat1->poisson = 0.3;
mat1->thickness = 1.0;
WATCH(mat1->density)
WATCH(mat1->getDensity())

free(mat_prop[0]);
free(mat_prop);

return 0;
}

我认为构造是正确的,但它在行中给出了一个段错误

WATCH(mat1->getDensity())

但是,当 virtual 关键字被移除时,代码运行正常。谁能帮我解释一下为什么?

最佳答案

calloc() 只能用于为原始类型和 POD 结构分配空间。因为你的结构有一个虚函数,它不是 POD,所以你需要使用 new 来确保 vtable 被正确创建。

mat_prop_t **mat_prop = new mat_prop_t*[1];
mat_prop[0] = new mat_el_prop;
mat_el_prop *mat1 = mat_prop[0];

从技术上讲,您可以将 calloc() 用于 mat_prop,因为它是一个指针数组。但在 C++ 中,您通常应该使用 new,而不是 C 内存分配函数。

关于c++ - 调用struct的虚函数时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38926225/

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