2013-10-21 78 views
1

stdlib的free()函數不適用於stl變量。 有沒有一種常見的方式來釋放由stl(像矢量,地圖,集等)舉起的空間?釋放stl所佔用的空間

+0

你沒有(在大多數情況下) – P0W

+0

您是否在尋找類似的'delete'運算符(如果您的STL容器分配在堆上)? –

+0

@POW所以C++有自動垃圾收集? – ishan3243

回答

1

STL對象自動處理自己的釋放。當一個STL對象超出作用域時,它的析構函數將被運行,這將實現必要的釋放。正如FrédéricHamidi在評論中指出的那樣,如果在堆上分配,您應該自己釋放對象。在C++中建議使用new/delete而不是C的malloc/free組合。

+1

除非它通過'new'運算符被分配在堆上。 –

+1

@FrédéricHamidi:免費店鋪* –

+0

@光,免費商店是正確的術語,是的,我站在更正:) –

1

free是一個C函數,不調用析構函數;因此,它在C++中幾乎總是錯誤的。 delete在C++中是等效的。

儘管如此,你應該在這裏做什麼取決於你的意思是「STL變量」。如果你的意思是C++標準庫對象,那麼你去分配他們以同樣的方式使用C你去分配任何對象++:

  1. 如果沒有手動內存管理對象,無能爲力 ;

    int main() 
    { 
        std::vector<int> v{0,1,2}; 
    } 
    
  2. 如果手動與new創建它的內存管理的對象,你可以使用delete;

    int main() 
    { 
        std::vector<int>* ptr = new std::vector<int>(); 
        ptr->push_back(0); 
        ptr->push_back(1); 
        ptr->push_back(2); 
        delete(ptr); 
    } // (PLEASE don't do this) 
    
  3. 如果手動內存管理由在陣列中與new[]它創建的對象,使用delete[]

    int main() 
    { 
        std::vector<int>* ptr = new std::vector<int>[1]; 
        ptr[0].push_back(0); 
        ptr[0].push_back(1); 
        ptr[0].push_back(2); 
        delete[](ptr); 
    } // (PLEASE don't do this either) 
    

然而,在情況2和3,你應該真正使用了智能指針代替,如std::unique_ptrstd::shared_ptr;手動內存管理是不好

你不應該嘗試手動內存管理C++標準庫容器內的任何元素,容器擁有這些和意志已經免費了需要記憶:

int main() 
{ 
    std::vector<int> v{0,1,2}; 
    delete &v[0]; 
} // (So, so wrong) 
+0

Downvoted事實。太好了! –

+1

我對你最後一句話感到困惑。如果你做了一個新的,你做一個刪除。爲什麼「不這樣做」的評論?我敢肯定,當你需要在STL數據結構上創建指針時,有很多情況... – Kaidjin

+0

可能表明應該避免手動管理。 – Basilevs