包含向量的指针列表的内存管理

时间:2015-09-16 13:55:33

标签: c++ pointers memory-management linked-list

我正在测试此代码以了解程序内存的管理方式,这要归功于Windows资源监视器。

class A {
public:
        string name_;
        vector<double> H;
        vector<float> G;
        vector<string> I;
        int abc;
};
list<A *> test (90000);

void allocate_class() {
    for (list<A *>::iterator it= test.begin(); it != test.end();it++) {
         A *ptr=*it;
         ptr = new A;
    }
}

void init_fct() {
    for (list<A *>::iterator it= test.begin(); it != test.end();it++) {
        A *ptr=*it;
         /* 
        all above doesnt work program crash

        (*ptr).name_ = "hello test";
        ptr->name_ = "hello test";
        ptr->abc = 57; 
        */

    }
}

void erase_class() {
     list<A *>::iterator it= test.begin();
     while( it != test.end() )
         it = test.erase(it);
 }

void delete_ptr() {
    for (list<A *>::iterator it= test.begin(); it != test.end();it++) {
        A *ptr=*it;
        delete ptr;
    }
}

int main()
{
int t;

cout << "before allocation" << endl;
cin >> t;

allocate_class();

cout << "after allocation" << endl;
cin >> t;

init_fct();

cout << "after init" << endl;
cin >> t;

erase_class();

cout << "after erase" << endl;
cout << test.size();
cin >> t;

delete_ptr();
cout << "after delete" << endl;
cout << test.size();
cin >> t;

问题:

  1. 在这种情况下是否真的需要操作员删除部分? (不确定它是否真的有空位)

  2. 我在init_fct()中做错了什么/遗失了什么?

  3. 注意:(属性是故意公开的,cin是暂停程序并检查内存状态)

1 个答案:

答案 0 :(得分:2)

     A *ptr=*it;
     ptr = new A;

这使得(未初始化的)指针的副本存储在列表中,然后将指向新分配的{{{{{ 1}}。然后副本超出范围,并且您有内存泄漏。

当然,由于列表中的指针没有改变,以后使用它们会导致未定义的行为。

要解决此问题,请更改列表中的指针:

A

关于你的 *it = new A; 功能:它现在是正确的,因为它清除了列表。但是,在删除列表中的指针之前调用它时,仍然存在内存泄漏:

首先从列表中删除所有指针,然后尝试删除分配的内存。但是由于你的列表中没有任何指针,迭代它只会做什么。

看看你的目标,检查内存使用情况,这可能是你想要的东西:

erase_class

请注意,使用智能指针(或者在这种情况下根本没有指针)作为列表元素可以免除手动删除已分配内存的负担。