调用结构的虚函数时出现segfault
seg fault when calling virtual function of struct
下面是一个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
来确保虚函数表被正确创建。
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的内存分配函数。
相关文章:
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 导致SegFault C++的析构函数
- 将数组传递给C 函数时,segfault
- 用于评估导致Segfault的Postfix的函数
- SegFault将插入std :: vector的成员函数插入std :: vector
- 类析构函数 SEGFAULT
- std::函数析构函数中的Segfault
- 在函数结束后仅释放 Segfault 与 vsnprintf 一起消失
- 主函数执行之前的C++segfault
- 调用一些PyObject函数会导致segfault-Boost python
- 在构造函数中使用curl_easy_init会导致segfault
- 析构函数上的Segfault
- 通过多个函数传递指针并获取segfault
- v8在Windows上的HandleScope构造函数中的SegFault
- 在析构函数中释放内存时出现segfault
- 调用结构的虚函数时出现segfault
- 将矢量指针传递给函数会导致segfault
- 当类被创建为shared_ptr时,添加到类中的其他函数会导致segfault
- 为什么我的合并函数会给我一个segfault
- 调用 DLL 函数的 SEGFAULT