gpt4 book ai didi

c++ - 包含 vector 的指针列表的内存管理

转载 作者:行者123 更新时间:2023-11-30 03:49:21 26 4
gpt4 key购买 nike

感谢 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() 中做错了什么/遗漏了什么?

注意:(属性是有意公开的,cin是暂停程序和检查内存状态)

最佳答案

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

这为存储在列表中的(未初始化的)指针创建了一个拷贝,然后将指向新分配的 A 实例的指针分配给该拷贝(而不是列表中的指针)。然后拷贝超出范围,内存泄漏。

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

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

     *it = new A;

关于您的 erase_class 函数:它现在是正确的,因为它清除了列表。但是当你在删除列表中的指针之前调用它时,你仍然有内存泄漏:

您首先从列表中删除所有指针,然后尝试删除分配的内存。但是由于您的列表中没有任何指针,因此对其进行迭代将无济于事。

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

list<A*> l;
cin >> dummy;
// The list will allocate space to hold the pointers:
l.resize (90000);
cin >> dummy;
// Allocate instances for each pointer in the list
for (auto & ptr : l) {
ptr = new A{};
}
cin >> dummy;
// Free the allocated instances
for (auto & ptr : l) {
delete ptr;
}
cin >> dummy;
// Erase all elements from the list.
// Note that this is not necessary, when
// the list goes out of scope at the end
// of main this is done by the list destructor.
// Moreover, there's a function to erase
// all elements from the list:
// l.clear();
auto it = l.begin();
while (it != l.end()) {
it = l.erase(it);
}
cin >> dummy;

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

关于c++ - 包含 vector 的指针列表的内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610657/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com