2017-04-05 68 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

不是很明显,但它完全不明显,它在做什么以及它为什么这样做。如果你必须提出这样的问题,我并不认为你有能力设计一个应用程序框架。 –