2015-07-21 106 views
-1

我有對付C++遺留代碼的全部內存泄漏的,而我正在努力解決這些問題,而不重構的一切,我遇到了以下問題:c + +返回靜態分配的派生類對象

abstract_base make_derived(int parameter) 
{ 
    switch(parameter) 
    { 
    case 1: 
    return derived1; 
    break; 
    case 2: 
    return derived2; 
    ... 
    } 
} 


abstract_base do_something(int parameter) 
{ 
    ... 
    auto return_value = make_derived(parameter); 
    .... 
    return return_value; 

} 

abstract_base是基類,顯然
derived1,Derived2的,... derivedn從abstract_base

衍生LLVM說RETURN_VALUE是抽象的,不能被實例化。 如何返回不帶指針的派生類對象(在返回動態分配對象之前)/智能指針或任何變通方法?

+2

你不能,因爲爲了複製對象本身(而不是複製指針),它的大小需要在編譯時知道。每個子類可能有不同的大小。你最終會將你的對象切片到基類部分。 'std :: unique_ptr'有什麼問題? – Cameron

+2

參考?衆所周知,無論如何你都會失去派生的對象部分(即使基礎不是抽象的),你需要一個引用(或指針) – deviantfan

+1

掛起,如果這些是靜態分配的對象,爲什麼你需要重寫它?帶指針的代碼不會比引用或對象副本泄漏更多... – Cameron

回答

0

你不能通過值返回abstract_base - 返回引用或指針(最有可能因爲你試圖修復了內存處理一個std::unique_ptr<abstract_base>std::shared_ptr<abstract_base>)。