Для моего кода expand - удвоить емкость вектора. Он должен динамически перераспределять память для динамически распределенного массива и обновлять значение емкости, не создавая утечки памяти.
Мне было интересно, как вы проверили бы утечку памяти, поскольку мое тестирование не показывает время выполнения в Visual Studio.
void IntVector::expand(){
cap = cap * 2;
int *data2;
data2 = data;
IntVector::~IntVector();
data = new int[cap];
data = data2;
delete data2;
}
header (я понимаю, что вы не должны использовать пространство имен std).
#ifndef INTVECTOR_H
#define INTVECTOR_H
using namespace std;
class IntVector{
private:
unsigned sz;
unsigned cap;
int *data;
public:
IntVector();
IntVector(unsigned size);
IntVector(unsigned size, int value);
unsigned size() const;
unsigned capacity() const;
bool empty() const;
const int & at (unsigned index) const;
const int & front() const;
const int & back() const;
~IntVector();
void expand();
};
#endif
основной файл
#include "IntVector.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
IntVector::IntVector(){
sz = 0;
cap = 0;
data = NULL;
}
IntVector::IntVector(unsigned size){
sz = size;
cap = size;
data = new int[sz];
*data = 0;
}
IntVector::IntVector(unsigned size, int value){
sz = size;
cap = size;
data = new int[sz];
for(int i = 0; i < sz; i++){
data[i] = value;
}
}
unsigned IntVector::size() const{
return sz;
}
unsigned IntVector::capacity() const{
return cap;
}
bool IntVector::empty() const{
if(sz > 0){
return false;
}
else{
return true;
}
}
const int &IntVector::at(unsigned index) const{
if(index > sz){
exit(1);
}
else{
return data[index];
}
}
const int &IntVector::front() const{
return data[0];
}
const int &IntVector::back() const{
return data[sz];
}
IntVector::~IntVector(){
delete data;
}
void IntVector::expand(){
cap = cap * 2;
int *data2;
data2 = data;
IntVector::~IntVector();
data = new int[cap];
data = data2;
delete data2;
}
Редактировать::
void IntVector::expand(){
cap = cap * 2;
int *data2 = data;
data = new int[cap];
delete[] data2;
delete data2;
}
Эти две строки:
data = new int[cap];
data = data2;
Выделите массив ints, а затем сразу переопределите указатель, ведущий к нему, тем самым потеряв выделенную память навсегда. Это утечка памяти.
Использование valgrind или аналогичных инструментов должно привести к этим ошибкам очень легко.
Чтобы протестировать утечки памяти в Visual Studio:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
и эта следующая строка автоматически отобразит отчет о утечке памяти в каждом месте вашего кода, где происходит выход приложения.
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
Отредактировано для maxywb
Я использую диспетчер задач из окон.
в окнах 8: вкладка "Сведения" → щелкните правой кнопкой мыши по столбцу и "выберите столбцы" → объекты GDI
Следите за этой колонкой, если она продолжает расти, пока она не должна, тогда у вас есть утечка.
data = data2;
? Это оставитdata
указывающие на старые данные, которые вы затем уничтожите.delete[]
для освобождения массива. И вам нужно реализовать конструктор копирования / оператор присваивания.