簡體   English   中英

從指針向量中刪除對象

[英]Deleting objects from a vector of pointers

我看了很多非常相似的問題,但仍然無法解決。

考慮簡單的類:

class Obj
{
public:
    Obj(int moose);
    ~Obj();

private:
    int* val;
};


Obj::Obj(int num)
{
    val = new int;

    *val = num;
}


Obj::~Obj()
{
    printf("Cleanup");
    delete val;
}

現在,我想有一個指向objs的指針向量。 來源詳細說明了問題:

int main(int argc, const char * argv[])
{
    std::vector<Obj*> objs;

    Obj* o = new Obj(10);

    objs.push_back(o);

    objs.erase(objs.begin() + 0);

    // should have been deleted by now - I want the destructor to have been called
    // I have tried delete objs[0], casting to it and then deleting it.

    return 0;
}

僅在程序完成時才調用Obj中的析構函數。 我希望在從向量中刪除對象時調用它。

澄清:我正在嘗試使用向量中的引用刪除對象。 我無法做到這一點。 我知道向量不會釋放內存。 它只是從向量中刪除引用。 任何人都可以提供代碼來刪除對象並使用向量中的引用調用析構函數。

編輯:

即使添加:

auto it = objs.begin() + 0;
delete *it;
objs.erase(it);

如建議的那樣,Obj的析構函數不會觸發。

正如許多評論所指出的那樣, vector.erase僅從向量中刪除元素。 它不會嘗試刪除任何關聯的內存。
要顯式刪除關聯的內存,您需要:

int main(int argc, const char * argv[])
{
    ...

    auto it = objs.begin() + i;
    delete *it;
    objs.erase(it);

}

實際上,在您的情況下:

int main(int argc, const char * argv[])
{
    std::vector<Obj*> objs;

    Obj* o = new Obj(10);
    objs.push_back(o);    

    auto it = objs.begin();
    delete *it;
    objs.erase(it);

}

您的代碼還有許多其他不一致之處,還有針對您要執行的操作的更好的解決方案,例如:

  • 使用vector<Obj>

     int main(int argc, const char * argv[]) { std::vector<Obj> objs; objs.emplace_back(10); auto it = objs.begin(); objs.erase(it); } 
  • 如果您需要動態分配對象,但由於某種原因不希望向量處理該對象,則可以使用shared_ptrunique_ptr ,它們將為您處理釋放:

     int main(int argc, const char * argv[]) { std::vector<std::unique_ptr<Obj>> objs; objs.emplace_back(new Obj(10)); auto it = objs.begin(); objs.erase(it); } 

當從向量中刪除元素(即指針)時,您只是將其從容器向量中刪除。 但是指針指向的位置仍然是堆上的有效內存。 如果要釋放該內存,則應使用delete並顯式釋放該內存。 如果您不想自己管理內存,請使用智能指針。

當您從向量中刪除一個項目時,該項目的析構函數將被調用。 但是,在這種情況下,該項目是一個指針,和指針沒有析構函數。 指針指向的對象將不會調用其析構函數,直到您對指針使用delete為止。 如果指針被擦除並且您沒有它的另一個副本,則您將永遠無法刪除它,並且會發生內存泄漏。

盡可能將對象本身放在向量中,而不要放在指針中。 這將減輕您繁瑣的內存管理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM