簡體   English   中英

C ++,擦除向量

[英]C++ , Erasing Vector

我是cpp的新手,我用此代碼定義了一個向量,最后我想完全刪除它。

#include <string>
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;


struct MCLASS
{
    string *a = new string();
    string *b = new string();

    MCLASS(string ax,string bx)
    {
        a = new string(ax);
        b = new string(bx);
    }

    ~MCLASS()
    {
        delete a;
        delete b;
    }
};

vector<MCLASS*> *vc = new vector<MCLASS*>;




int main()
{
    for (int i = 0 ; i <= 1000000 ; i++)
        vc->push_back(new MCLASS("EHEM","UHUM"));

    for (int i = 0 ; i <= 1000000 ; i++)
        delete vc->at(i);

    vc->clear();
    delete vc;
    cout<<"Deleted";
    cin.get();

    return 0;
}

但是有一個問題。我無法完全擦除它。我試圖刪除矢量的每個項目,清除矢量項目,然后將其刪除。但是當我檢查此應用程序的RAM使用情況時,它使用了約130MB。請向我該怎么辦。謝謝!

您正在為每個成員變量調用兩次new string 對於每個new string ,第二次調用new string的結果都會覆蓋第一個new string的結果,因此第一個永遠不會被delete d,這會導致內存泄漏。

不要在ab的聲明中調用new string僅在構造函數中。

struct MCLASS
{
    string *a;
    string *b;
...

來自cplusplus.com關於vector::clear文章

由於調用此函數,不能保證會發生重新分配,也不保證矢量容量會發生變化。 強制重新分配的典型替代方法是使用swap: vector<T>().swap(x); // clear x reallocating vector<T>().swap(x); // clear x reallocating

正如弗拉基米爾(VladimirS)在評論中所建議的那樣; 內存管理不是一個簡單的野獸,但是上述操作應該減少您的內存消耗,前提是沒有任何事情可以通過替換Delete來阻止它(例如某些內存檢查工具)。

如果要擦除std::vector所有內容,則可以調用clear成員函數或將其大小調整為零。

結果略有不同。 clear將破壞所有元素,但(可能)保留向量的容量。 resize(0)將破壞所有元素,並將容量減少到零。

您的錯誤發生在第10-11行:

string *a = new string();
string *b = new string();

確實,您創建了兩個指針ab並為它們分配了內存,因為您在不檢查值的情況下在構造函數中重新分配了新內存,所以您將永遠無法釋放內存。

解決該問題(正確的做法)的正確方法是將指針屬性初始化為NULL 在您的情況下,請按以下方式替換這些行:

string *a = NULL;
string *b = NULL;

然后,將其分配在構造函數中或某個地方...

溫馨提示

  • 在進行新操作刪除操作之前,請檢查當前值;)
  • 使用Valgrind或類似工具檢查內存泄漏

暫無
暫無

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

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