簡體   English   中英

如何避免 C++ 分段錯誤,指針超出 scope(多態性)

[英]How to avoid C++ segmentation fault with pointer out of scope (polymorphism)

由於嘗試訪問 if/else 塊中的指針值,我的代碼出現分段錯誤,我認為這是因為對象超出了 scope。

問題是我需要使用多態性以及我將父類型指針分配給哪種類型的子 object 取決於命令行輸入,所以我不確定如何避免 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 時出現分段錯誤。 我知道這是因為在我的 if/else 塊之后,H 和 C 類型的對象將退出 scope,但我不確定應該如何修復它。 將 H 和 C 對象放在堆上會起作用嗎? 或者也許在 if 語句之外聲明 H 和 C 對象?

提前感謝您的幫助。

我贊揚您診斷問題的根源。

最簡單的解決方案是使用動態 memory 分配分配HC並使用返回的指針。

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

p2做同樣的事情。

添加代碼以在 function 結束前釋放動態分配的 memory。

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 ,您將不需要刪除指針的行。

您可以動態分配。 我建議使用智能指針 這是一個例子:

std::unique_ptr<P> p1;
if(cond)
  p1.reset(new H(board));

您也可以使用原始指針,但是您需要自己管理生命周期。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM