我正在测试此代码以了解程序内存的管理方式,这要归功于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;
在这种情况下是否真的需要操作员删除部分? (不确定它是否真的有空位)
我在init_fct()
中做错了什么/遗失了什么?
注意:(属性是故意公开的,cin
是暂停程序并检查内存状态)
答案 0 :(得分:2)
A *ptr=*it;
ptr = new A;
这使得(未初始化的)指针的副本存储在列表中,然后将指向新分配的{{{{{ 1}}。然后副本超出范围,并且您有内存泄漏。
当然,由于列表中的指针没有改变,以后使用它们会导致未定义的行为。
要解决此问题,请更改列表中的指针:
A
关于你的 *it = new A;
功能:它现在是正确的,因为它清除了列表。但是,在删除列表中的指针之前调用它时,仍然存在内存泄漏:
首先从列表中删除所有指针,然后尝试删除分配的内存。但是由于你的列表中没有任何指针,迭代它只会做什么。
看看你的目标,检查内存使用情况,这可能是你想要的东西:
erase_class
请注意,使用智能指针(或者在这种情况下根本没有指针)作为列表元素可以免除手动删除已分配内存的负担。