![](/img/trans.png)
[英]How to initialize a pointer appropriately to avoid segmentation fault in c++?
[英]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 分配分配H
和C
並使用返回的指針。
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.