Проверка на утечку памяти?

0

Для моего кода 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;
}
  • 0
    Почему вы делаете data = data2; ? Это оставит data указывающие на старые данные, которые вы затем уничтожите.
  • 1
    Вам также необходимо использовать delete[] для освобождения массива. И вам нужно реализовать конструктор копирования / оператор присваивания.
Показать ещё 4 комментария
Теги:

3 ответа

3
Лучший ответ

Эти две строки:

data = new int[cap];
data = data2;

Выделите массив ints, а затем сразу переопределите указатель, ведущий к нему, тем самым потеряв выделенную память навсегда. Это утечка памяти.

Использование valgrind или аналогичных инструментов должно привести к этим ошибкам очень легко.

  • 0
    +1 для Вальгринда
1

Чтобы протестировать утечки памяти в Visual Studio:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

и эта следующая строка автоматически отобразит отчет о утечке памяти в каждом месте вашего кода, где происходит выход приложения.

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Отредактировано для maxywb

  • 0
    Вы можете упомянуть, что это специфично для Visual Studio. Я знаю, что ОП ищет решения VS, но это вежливо сказать.
-1

Я использую диспетчер задач из окон.

в окнах 8: вкладка "Сведения" → щелкните правой кнопкой мыши по столбцу и "выберите столбцы" → объекты GDI

Следите за этой колонкой, если она продолжает расти, пока она не должна, тогда у вас есть утечка.

  • 0
    Это только определяет очень небольшое количество утечек памяти и не находит утечку в вопросе

Ещё вопросы

Сообщество Overcoder
Наверх
Меню