gpt4 book ai didi

c++ - 调用派生类的虚函数时出现段错误

转载 作者:太空狗 更新时间:2023-10-29 23:36:26 25 4
gpt4 key购买 nike

当我调用派生类的虚函数时,我一直遇到段错误问题。但是,如果我将函数名称更改为不同于基类中虚函数的名称,则不会发生这些段错误。这是一些代码:

//in main
//initialize scene objects
//camera
if((camera = (Camera*)malloc(sizeof(Camera))) == NULL){
cout << "Could not allocate memory for camera" << endl;
}
//...code in middle
//inside file parsing...
//infile is an ifstream
//nextString is a char*
if(!strcmp(nextString,"camera")){
camera->parse(infile); //segfault here
}

这是基类头文件(.cpp 只在构造函数中实例化变量):

class WorldObj{
public:
WorldObj();
~WorldObj();
virtual void parse(ifstream&) =0;
vec3 loc; //location
};

下面是我用来编写虚函数的 Camera 类中的代码:

void Camera::parse(ifstream &infile){
//do parsing stuff
}

parse()在头文件中声明为virtual void parse(ifstream&);

我的问题是,如果我将 Camera 中的 parse() 重命名为 CameraParse() 之类的名称,并完全忽略存在要实现的虚函数这一事实,代码将完全正常工作!

您能否阐明为什么调用虚函数会导致段错误?我已经检查了 Valgrind 是否有任何内存问题,它告诉我有 8 个字节的无效读/写。我知道这意味着我没有为我的对象正确分配内存,但我不知道分配哪里出了问题。

任何帮助将不胜感激:)

最佳答案

你不能(只是)malloc 一个非 POD 对象,你必须 new 它。

这是因为 malloc 保留了适当的空间量,但没有构造对象,这对于任何具有虚函数的类来说都是非常重要的,即使默认构造函数。

现在,只有当您进行虚函数调用时才会出现特定问题,因为这取决于 new 执行的额外初始化,但是使用未构造的实例仍然是错误的任何非 POD 类型。


请注意,我使用 POD(Plain Old Data)作为仅进行简单初始化的任何事物的惰性速记。通常,如果一个类(或结构)及其任何成员或基类都没有做某事的构造函数,则该类(或结构)是可简单初始化的。出于我们的目的,每个具有一个或多个虚拟方法的类(即使它们是继承的,或在数据成员中)都需要进行重要的初始化。

具体来说,Ben Voigt 的回答中的标准引用描述了对象生命周期开始的两个阶段(在此期间您可以安全地进行方法调用,尤其是虚拟方法调用):

  • storage with the proper alignment and size for type T is obtained,

当您调用 malloc 时会发生这种情况

  • if the object has non-trivial initialization, its initialization is complete

当您使用 new 时,发生在非平凡初始化的类型上。


供引用,这是最接近您现有代码的正常使用:

Camera *camera = new Camera;
// don't need to check for NULL, this will throw std::bad_alloc if it fails
camera->parse(file);
// don't forget to:
delete camera;

不过,这是更好的风格:

std::unique_ptr<Camera> camera(new Camera);
camera->parse(file);
// destruction handled for you

并且仅当您确实需要使用malloc 或其他一些特定的分配器时:

Camera *camera = (Camera *)malloc(sizeof(*camera));
new (camera) Camera; // turn your pointer into a real object
camera->parse(file);
// destruction becomes uglier though
camera->~Camera();
free(camera);

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

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