2012-04-09 2 views
0

Как я могу освободить mamory в следующем примере. vt.pop_back() удаляет элемент в vt, но он не освобождает память. delete vt [i] не работает, и это дает мне ошибку сегментации.C++ vector new delete

#include <vector> 
#include <unistd.h> 

using namespace std; 

const int SIZE = 1000000; 

class Test 
{ 
public: 
    Test(); 
    ~Test();  
private: 
    int *arr;  
}; 


int main() 
{ 
    vector<Test *> vt; 
    for(int i = 0; i < 100; i++) 
     vt.push_back(new Test()); 
    sleep(10); 
    return 0;  
} 


Test::Test() 
{ 
    arr = new int[SIZE]; 
} 


Test::~Test() 
{ 
    delete[] arr; 
} 
+3

Почему вы даже используете новые? –

+0

Почему 'delete v [i]' не работает? В этом коде нет 'delete v [i]'. –

+0

потому что конструктор может содержать аргументы –

ответ

5

Вы не храните объекты «Test», вы храните указатели на эти объекты. Поэтому delete ничего не делает, кроме как удалить указатели.

Если вы хотите, чтобы ваши объекты, которые будут храниться в векторе, вы должны сделать тип

vector<Test> 

Этим способом Удалять вызовы на самом деле запустить деструктор объектов.

Полученный код становится:

int main() 
{ 
    vector<Test> vt; 
    for(int i = 0; i < 100; i++) 
     vt.push_back(Test()); 
    sleep(10); 
    return 0; 
} 

Как прокомментировал это также требует новый конструктор копирования:

Test::Test(const Test& t) 
{ 
    arr = new int[SIZE]; 
    for(int i = 0; i != SIZE; i++) 
     arr[i] = t.arr[i]; 
} 
+1

Не волнуйтесь, я «Я ничего не краду;) Случается все время: я слишком долго, чтобы опубликовать ответ, и в конечном итоге удаляю его, потому что он уже есть :) У вас +1. –

+0

@ R.MartinHoFernandes: Я знаю, особенно по таким вопросам, как этот. многие люди отвечают на минусы - и большинство из них в основном имеют одинаковый ответ :) –

+1

, но вектор vt; для (int i = 0; i <100; i ++) \t vt.push_back (Test()); не работает –

4

Вы можете использовать delete vt[i], как это, он будет освободить память, выделенную для Test объектов:

for(size_t i = 0; i < vt.size(); ++i) 
{ 
    delete vt[i]; 
} 
vt.clear(); 
1

Вы храните указатели и не t объектов, поэтому «объект-указатель» будет уничтожен, если вы уничтожите свой вектор, но не объект, на который указывает указатель

0

Если вы хотите удалить определенные элементы, попробуйте использовать функцию erase из std::vector.

Смежные вопросы