如何正确分配C 向量
How to correctly deallocate a c++ vector?
可能的重复:
如何正确处理或删除C 向量?
我遇到了一些问题,试图删除我在向量中分配的内存。即使我调用list.clear(),它也没有处理内存。
所以我在一个基于模板的类中有一些类似的代码,称为set
template <class T>
class Set {
public:
// stuff
private:
int size;
std::vector<T> list;
};
和在构造函数中,我为向量分配了内存。所以我调用list = new std :: 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);
}
在destructor中,我只有list.clear()删除所有元素,然后对内存进行处理。
但是问题是,当我在.out文件上运行valgrind时,它告诉我我绝对失去了记忆,我不知道为什么会告诉我这一点。我在Stackoverflow上阅读了一些问题,但我基本上尝试了所有问题。我尝试了clear(),然后在矢量上删除,但这无效。然后,我尝试擦除(list.begin(),list.end.end()),但这也没有用。
我的思考过程是我使用的是一组 *aset = new Set;在我的主要类中,由于int不是一个对象,因此当我调用list.crear()时,它不会被释放。这是正确的吗?我将如何正确删除内存?
感谢您的任何帮助。
edit1 =更改列表* to 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 log:
==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
我的思考过程是我在主要类中使用了
Set *aSet = new Set;
,并且由于INT不是对象,因此当我调用list.clear.clear()时,它不会被释放。这是正确的吗?我将如何正确删除内存?
否。要删除正确分配的内存,您需要调用DELETE:
Set *aSet = new Set;
delete aSet;
但是,手动管理这样的内存是困难而容易出错的。您应该更喜欢替代方案。首先是您根本不应该使用动态分配。您应该简单地使用自动变量:
Set aSet;
// no delete required. Variable destroyed/deallocated when it goes out of scope.
如果您确实需要动态分配,则应使用智能指针。
std::unique_ptr<Set> aSet(new aSet);
智能指针实现RAII进行动态分配,因此您不必手动进行。
在某些极少数情况下,您实际上可能需要手动进行动态分配,但这是一个预先的话题。
std::vector<T>::clear()
不需要对向量的内存进行处理。您可以使用C 11成员函数shrink_to_fit()
,也可以使用交换技巧:
std::vector<int> list;
...
std::vector<int>(list).swap(list);
您也不应该使用指向向量的指针。向量使用RAII为您管理动态内存。当您使用指向向量的指针时,您将不再有自己的好处,即不手动管理资源。
在进行new list
之前,您需要进行delete list
,否则您会在发现时会获得内存泄漏。在删除列表之前,也无需clear
,删除器也会自动清除它。编辑:您还需要删除Set
类Destructor中的指针。
一个小主题提示,不要使用可能误认为内置类型的list
之类的变量名称。
更重要的提示是将std::vector
用作直接成员变量而不是指针。在这种情况下,您肯定需要使用clear
。
如果您在C 11中工作,则可以使用Shrink_to_fit()。据我了解,虽然这是非结合和实施可能会阻止它实际收缩。
- 用字符串的向量分配字符串向量
- 如何将向量分配给参考变量?
- 如何将C++向量分配给非表全局变量
- 向量分配上的 C++ 分割错误
- 如何将int分解为数字并以相同的顺序为向量分配数字
- 将向量分配给一个元素
- 将向量分配给向量向量的向量时,向量是范围的
- 带有Valgrind的C 的向量分配中的内存泄漏
- 将向量分配给另一个
- 为向量分配内存
- 为结构的整个向量分配结构的元素
- 将向量分配给结构的向量字段
- C++对象的向量:分配对象
- C++:通过从映射向量分配映射实例来填充映射的映射
- 将儿童的向量分配给祖父母的向量
- 使用 std::向量分配的类比 LOT 的指针分配慢
- C++ 向量分配问题
- 为什么向量分配会改变分配的向量
- 在C++中初始化向量时,你能给向量分配一个大的内存块吗
- 向量分配中的问题