gpt4 book ai didi

c++ - 如何避免指针超出范围的 C++ 段错误(多态性)

转载 作者:行者123 更新时间:2023-11-27 23:36:46 24 4
gpt4 key购买 nike

由于尝试访问 if/else block 中的指针值,我在代码中遇到了段错误,我认为这是因为对象超出了范围。

问题是我需要使用多态性,我将父类型指针分配给哪种类型的子对象取决于命令行输入,所以我不确定如何避免 if/else。

代码如下。我知道变量名不好,顺便说一句,我只是为了这个问题而简化它们。

P * p1;
P * p2;
B board = B();

if(strcmp(argv[1], "h") == 0) {
H h = H(board);
p1 = &h;
} else {
C c = C(board);
p1 = &c;
} //else


if(strcmp(argv[2], "h") == 0) {
H h = H(board);
p2 = &h;
} else {
C c = C(board);
p2 = &c;
} //else


// Then, if I try to refer to pointer p1, I get a segmentation fault.
// I know why this happens, but am not sure how to fix it.
// For example, this code is problematic:

if(strcmp(argv[1], "h") == 0){
string n;
cin >> n;
p1->setName(n);
} //if

在此之后引用指针 p1 和 p2 时出现段错误。我知道这是因为 H 和 C 类型的对象在我的 if/else block 之后超出了范围,但我不确定我应该如何修复它。将 H 和 C 对象放在堆上可行吗?或者在 if 语句之外声明 H 和 C 对象?

在此先感谢您的帮助。

最佳答案

我赞扬您诊断问题的根源。

最简单的解决方案是使用动态内存分配分配 HC 并使用返回的指针。

if(strcmp(argv[1], "h") == 0) {
p1 = new H(board);
} else {
p1 = new C(board);
}

p2 做同样的事情。

添加代码以在函数结束前释放动态分配的内存。

delete p1;
delete p2;

您可以使用智能指针使重新分配更容易。

std::unique_ptr<P> p1;
std::unique_ptr<P> p2;

...

if(strcmp(argv[1], "h") == 0) {
p1.reset(new H(board));
} else {
p1.reset(new C(board));
}

通过使用 std::unique_ptr,您将不需要删除指针的行。

关于c++ - 如何避免指针超出范围的 C++ 段错误(多态性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58663400/

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