2017-04-05 105 views
1

我有一個關於指針問題:C++ |法範圍指針管理

class CAppFramework : public IBaseApp 
{ 
public: 
    CAppFramework(std::initializer_list< CClientApp* > input); 
    CAppFramework(); 
    ~CAppFramework(); 

    void Create() override; 
    void Release() override; 

    template< class T > T** Request(std::string c_appname) 
    { 
     for (auto c_app : m_ClientApps) 
     { 
      if (c_app -> GetName() == c_appname) 
      { 
       T** t_app = reinterpret_cast< T** >(c_app); 

       return t_app; 
      } 
     } 

     return nullptr; 
    } 

    std::vector< CClientApp* >& GetClientApps(); 

private: 
    std::vector< CClientApp* > m_ClientApps; 
}; 


void CTest::Create() 
{ 
    std::cout << "Ayye" << std::endl; 

    CTest* test = *(m_Framework->Request<CTest>( 
    "Test")); 
    test -> RunTest(); 
} 

CTEST是CClientApp派生類。

我需要刪除測試嗎?如果我這樣做,會導致訪問衝突。 我想這是因爲「請求」返回一個指向矢量內的指針的指針,所以當我解引用它並刪除它時,它會刪除該矢量中的對象,它可能仍會被使用?

這是一個更普遍的問題。我是否需要刪除每個指針或僅使用「新」動態分配的指針?

我希望有人能幫助我。

+0

如果您需要'reinterpret_cast'在這種情況下,某件事情是錯誤的。你能提供[MCVE]嗎? –

+0

對不起,我編輯並試圖使其可以理解。 – user7814615

回答

0

你顯然不需要刪除每個指針,否則你會寫這樣的代碼:

int main(int argc, char ** argv) { 
     // stuff 
     delete argv; 
} 

如果你明確地創建與new的東西,並指定新的指針給你一個原始指針,那麼你需要delete那個指針。當然,這很容易出錯,不能做成異常安全的,所以你應該使用像std :: unique_ptr和std :: make_unique。

+0

這意味着我的函數CTest :: Create不會導致任何內存泄漏? – user7814615

+0

不是很明顯,但它完全不明顯,它在做什麼以及它爲什麼這樣做。如果你必須提出這樣的問題,我並不認爲你有能力設計一個應用程序框架。 –