gpt4 book ai didi

C++:内存泄漏;类 vector 类

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:07 25 4
gpt4 key购买 nike

我是 C++ 初学者,尝试创建类似于 Vector 的容器类。此类对于所有类型的数据都应该像 Vector 一样工作,并且可以在基于范围的 for 循环中使用。我写了 hpp 但我的导师说有内存泄漏,我想我删除了所有的动态内存,问题可能在哪里?

#include "stdafx.h"
using namespace std;
template<class T>
class Customvector
{
public:
Customvector();
~Customvector();
int size();
int free_capacity();
void add(T& temp);
int& operator[](int index);
void grow();

class iterator {
public:
iterator(T* ptr) : ptr(ptr) {}
iterator operator++() { iterator i(ptr); ++ptr; return i; }
bool operator!=(const iterator & other) { return ptr != other.ptr; }
const T& operator*() const { return *ptr; }
private:
T* ptr;
};

iterator begin() const { return iterator(&_elements[0]); }
iterator end() const { return iterator(&_elements[0]+_size); }
private:
T* _elements;
int _size;
int _capacity;
int DEFAULT_CAPACITY;
};

template<class T>
Customvector<T>::Customvector()
{
DEFAULT_CAPACITY = 4;
_capacity = DEFAULT_CAPACITY;
_size = 0;
_elements = new T[_capacity];

}
template<class T>
Customvector<T>::~Customvector()
{
delete[] _elements;

}
template<class T>
void Customvector<T>::add(T& temp)
{
grow(); //check if the capacity is full, if so,increase capacity by DEFAULt_CAPACITY;
_elements[_size++]= temp;

}
template<class T>
int Customvector<T>::size()
{
return _size;
}

template<class T>
int Customvector<T>::free_capacity()
{
int free_c = _capacity - _size;
return free_c;
}


template<class T>
int& Customvector<T>::operator[](int index) {
if (index<0 || index>_capacity)
{
cout << "index beyond limit" << endl;
return _elements[0];
};
return _elements[index];
}

template<class T >
void Customvector<T>::grow()
{
if (_capacity == _size)
{
_capacity += DEFAULT_CAPACITY;
T* p = new T[_capacity];
std::copy(_elements, _elements + _size,p);
delete[] _elements;
_elements = p;
};

}

最佳答案

我能找到的唯一漏洞是在 grow 中:

    ...
T* p = new T[_capacity];
std::copy(_elements, _elements + _size,p); // may throw an exception
delete[] _elements;
_elements = p;
...

如果复制包含的元素抛出异常,则 _elements 仍指向旧数组,而 p 指向的新数组会泄漏。您可以使用 unique_ptr 解决此问题:

std::unique_ptr<T[]> p(new T[_capacity]);
std::copy(_elements, _elements + _size, p.get()); // it's OK if this throws, unique_ptr will take care of the memory
delete[] _elements;
_elements = p.release();

_elements 使用 unique_ptr 也会简化您的一些代码并提高正确性。

关于C++:内存泄漏;类 vector 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33283358/

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