gpt4 book ai didi

c++ - 尝试将父指针动态分配给函数内的子项会导致段错误

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

我一直致力于理解多态性和指针,但我对这个概念有些陌生。幸运的是,我有 stackoverflow 和 google,所以我的大部分问题都可以很容易地得到解答。然而,我已经尝试修复这个段错误几个小时了,但没有成功,我不确定是什么破坏了。我已经剥离了所有内容以尝试了解出了什么问题,但我相信我缺少动态分配的核心概念。

我将一个字符指针传递到我的函数初始化中,我不能在函数内部动态分配它吗?我的代码编译但在为(预期的)开关提供输入后出现段错误和核心转储。

但是,如果我排除函数 initialize 并仅在我的 main 函数中运行代码,则不会出现任何中断,并且 zed 会正确初始化为 barbarian 类型。

#include "character.h"//abstract class
#include "barbarian.h"//inherits character



void initialize(character *object){//gets the values for the object
//and lets user deem which type of object
int x=0;
cout<< "1. Barbarian."<<endl;
cout<< "2. Gollum."<<endl;
cout<< "3. Baba Yaga."<<endl;
cout<< "4. Blue Men Group."<<endl;
cout<< "5. Unicorn."<<endl;
while(!(cin>>x)){
cout<<"Input not valid."<<endl;
cin.clear();
cin.ignore(10000,'\n');
}
cout<<"Input is: "<<x<<endl; //debug line
object = new barbarian("conan"); //seg fault here
//down here is a switch that was excluded for this question
}

void die(character *kill){//is now kill
delete kill;
} //this should delete the character after it is used

int main(){
srand(time(0));//used for roll functions in the parent class
cout<<(-time(0))<<"seconds until 1970"<<endl;//debug makes sure srand is
//doing what I want it to

character* zed; //zed = new barbarian("conan");//In main this works
initialize(zed);
//zed = new barbarian("conan"); This works
(*zed).atkRoll();
(*zed).defRoll();
die(zed);
}

我希望能够传递一个字符指针,然后将其作为用户选择的类分配在堆上,并在 main 调用的其他函数中使用它。我认为可以只传递指针并将其作为函数中的参数。然后本地指针将指向与 main 中的指针相同的位置。当函数作用域关闭并且“对象”被删除时,main 中的指针应该仍然指向野蛮人的内存位置。这是无效的吗?如果是这样,我能做些什么作为替代方案?不告诉指针就不能在main中改变指针的类型吗?

我很困惑>。<

最佳答案

我认为这应该是这样的:

void initialize(character **object){
/* ... */
*object = new barbarian("conan");
}

否则你不是在修改实际的指针,而是它的临时拷贝。您需要将指针传递给指针。然后,在 main() 中:

character* zed;
initialize(&zed);

对你最后一段中的问题的解释:

您在 main() 中有 character* zed。这意味着,一个包含地址的指针变量(还没有有意义的地址,只是垃圾):

zed = 0x12345678

现在调用initialize(zed)。在该函数中,有一个名为object 的“指向野蛮人的指针”类型的参数。它被初始化为 zed 的拷贝,即 zed 的值:

zed = 0x12345678
object = 0x12345678

现在调用 object = new barbarian()。分配内存并将地址保存在 object 中:

zed = 0x12345678
object = 0xABCDEF00

现在 initialize() 退出。 object 是临时的,会被销毁。剩下的:

zed = 0x12345678 (garbage)
object doesn't exist

修复在我回答的开头。

段错误应该发生在 main() 中,而不是在 initialize() 中,我认为:

(*zed).atkRoll();
(*zed).defRoll();

因为您在未初始化的指向对象的指针上调用方法(假设)尝试访问对象的字段。

还有:

void die(character **kill){
delete *kill; *kill == nullptr;
}

尽管这种方法的想法对我来说看起来很糟糕。

关于c++ - 尝试将父指针动态分配给函数内的子项会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35330331/

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