gpt4 book ai didi

c++ - 如何正确解除分配 C++ vector ?

转载 作者:太空宇宙 更新时间:2023-11-04 15:24:00 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
How to correctly deallocate or delete a c++ vector?

我在尝试删除我在 vector 中分配的内存时遇到了一些问题。即使我调用了 list.clear(),它也没有释放内存。

所以我在一个名为 Set 的基于模板的类中有一些这样的代码

template <class T>
class Set {
public:
// stuff
private:
int size;
std::vector<T> list;
};

在构造函数中,我为 vector 分配了内存。所以我调用 list = new std::vector;

为了您的兴趣,这里是我的复制构造函数和赋值运算符,我也在其中为 vector 分配内存:

template <class T>
Set<T>::Set(const Set& aSet)
{
size = aSet.size;
list->clear();
list = new vector<T>;
for (int i = 0; i < size; ++i) {
list[i] = aSet.list[i];
}
}

template <class T>
Set<T>& Set<T>::operator=(const Set& right)
{
if (this != &right) {
list->clear();
size = right.size;
list = new vector<T>;
for (int i = 0; i < size; ++i) {
list[i] = right.list[i];
}
}
return (*this);
}

在析构函数中,我只使用 list.clear() 来删除所有元素,然后释放内存。

但问题是,当我在我的 .out 文件上运行 valgrind 时,它告诉我我确实失去了一些内存,但我不知道为什么它会告诉我这个。我已经在 Stackoverflow 上阅读了一些问题,但我基本上已经尝试了所有方法。我试过 clear() 然后在 vector 上删除但那没有用。然后我尝试 erase(list.begin(), list.end()) 但这也不起作用。

我的思考过程是我正在使用 Set *aSet = new Set;在我的主类中,由于 int 不是对象,所以当我调用 list.clear() 时它没有被释放。这是正确的吗?我将如何正确删除内存?

感谢您的帮助。

Edit1 = 将 list* 更改为 setList

我的新构造函数和赋值运算符:

template <class T>
Set<T>::Set(const Set& aSet)
{
size = aSet.size;
setList.clear();
setList = aSet.setList;
}

template <class T>
Set<T>& Set<T>::operator=(const Set& right)
{
if (this != &right) {
setList.clear();
size = right.size;
setList = right.setList;
}
return (*this);
}

不过,Valgrind 仍然报告说我失去了相同数量的内存。在我的析构函数中,我仍然有 list.clear()

Valgrind 日志:

==11398== 
==11398== HEAP SUMMARY:
==11398== in use at exit: 62,969 bytes in 352 blocks
==11398== total heap usage: 540 allocs, 188 frees, 68,046 bytes allocated
==11398==
==11398== LEAK SUMMARY:
==11398== definitely lost: 8,624 bytes in 14 blocks
==11398== indirectly lost: 1,168 bytes in 5 blocks
==11398== possibly lost: 4,829 bytes in 56 blocks
==11398== still reachable: 48,348 bytes in 277 blocks
==11398== suppressed: 0 bytes in 0 blocks
==11398== Rerun with --leak-check=full to see details of leaked memory

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