2016-12-02 40 views
0

我在空閒時間正在進行一個小型遊戲,並且在編碼時遇到了一個問題。這是某種指針錯誤?

我已經分離出的問題,並使其儘可能小的位置:

#include <iostream> 
#include <memory> 
#include <vector> 
#include <Windows.h> 
class Base 
{ 
public: 
    std::string p; 
    virtual ~Base() 
    { 

    } 
    virtual std::vector<std::shared_ptr<std::string>> getText() = 0; 
}; 
class Derived1 : public Base 
{ 
public: 
    Derived1() 
    { 
     p = "from1"; 
    } 
    std::vector<std::shared_ptr<std::string>> getText() 
    { 
     return std::vector<std::shared_ptr<std::string>>{std::shared_ptr<std::string>(&p)}; 
    } 
}; 
class Derived2 : public Base 
{ 
public: 
    Derived2() 
    { 
     p = "from2"; 
    } 
    std::vector<std::shared_ptr<std::string>> getText() 
    { 
     return std::vector<std::shared_ptr<std::string>>{std::shared_ptr<std::string>(&p)}; 
    } 
}; 
int main() 
{ 
    std::unique_ptr<Base> state; 
    std::vector<std::shared_ptr<std::string>> displayText; 
    state.reset(new Derived1()); 
    displayText = state->getText(); 
    while(1) 
    { 
     for(auto i = displayText.begin(); i != displayText.end(); ++i) 
      std::cout << **i; 
     if (GetKeyState('2') < 0) 
     { 
      state.reset(new Derived2()); 
      displayText.clear(); 
      displayText = state->getText(); 
     } 
     else if (GetKeyState('1') < 0) 
     { 
      state.reset(new Derived1()); 
      displayText.clear(); 
      displayText = state->getText(); 
     } 
    } 
    return 0; 
} 

當按下「1」和「2」來回,似乎有時工作,當我離開了我得到類似-1073741510或類似的返回值。在我的遊戲代碼中,它也似乎崩潰了很多。

(通過口出我的意思是使用命令窗口上的X按鈕,抱歉沒有澄清)

多態類一起做上一般的unique_ptr一些研究和三分球后,我仍然無法理解爲什麼按照它的方式行事。

那麼,這是怎麼回事?

+0

定義「退出」。所示的代碼沒有提供乾淨地終止程序的方法。它運行在一個無限循環中。 –

+0

@SamVarshavchik修好了,對不起,沒有澄清 –

回答

0

您正在從堆棧變量創建shared_ptr。這將最終調用p上的delete,這是不安全的。請參閱Calling delete on variable allocated on the stack

編輯: 您需要使p指針。您可以執行以下操作:

class Base 
{ 
public: 
    std::shared_ptr<std::string> p; 
    virtual ~Base() 
    { 

    } 
    virtual std::vector<std::shared_ptr<std::string>> getText() = 0; 
}; 
class Derived1 : public Base 
{ 
public: 
    Derived1() 
    { 
     p = std::make_shared<std::string>("from1"); 
    } 
    std::vector<std::shared_ptr<std::string>> getText() 
    { 
     return std::vector<std::shared_ptr<std::string>>{p}; 
    } 
}; 
class Derived2 : public Base 
{ 
public: 
    Derived2() 
    { 
     p = std::make_shared<std::string>("from2"); 
    } 
    std::vector<std::shared_ptr<std::string>> getText() 
    { 
     return std::vector<std::shared_ptr<std::string>>{p}; 
    } 
}; 
+0

好吧,有無論如何我可以解決這個問題嗎? –

+0

您需要使p指針。你可以做類似如下: 'Base類 { 市民: \t的std :: shared_ptr的磷; \t虛擬〜基地(){} \t虛擬的std ::矢量<性病:: shared_ptr的>的getText()= 0; }; 類Derived1:公共基地 { 公共: \t Derived1() \t { \t \t p值=標準:: make_shared ( 「1跳轉」); \t} \t的std ::矢量<性病:: shared_ptr的>的getText() \t { \t \t返回的std ::矢量<性病:: shared_ptr的> {P}; \t} };' –

+0

是的,有一種方法。請參閱'shared_ptr'的文檔。 –