Как избавиться от утечки памяти

127
26 апреля 2019, 09:30

Есть код, при рантайме выдает ошибку сегментации:

#include <iostream>
using namespace std;
class StudentList
{
private:
    class Student
    {
    private:
        string name;
        int age;
        double height;
    public:
        Student *next;
        explicit Student(string n,int a,double h):
        name(n),
        age(a),
        height(h)
        {}
        string getName()
        {
            return name;
        }
        int getAge()
        {
            return age;
        }
        double getHeight()
        {
            return height;
        }
        ~Student()
        {}
    };
    Student *temp;
public:
    explicit StudentList()
    {
        temp=NULL;
    }
    ~StudentList()
    {
    }
    void list()
    {
        Student* student=temp;
        while(student)
        {
            cout<<temp->getName()<<"\t"<<temp->getAge()<<"\t"<<temp->getHeight()<<"\n";
            temp=temp->next;
        }
        //delete student;
    }
    void insertValue(string name,int age,double height)
    {
        Student *student=new Student(name,age,height);
        student->next=temp;
        temp=student;
    }
};

int main()
{
  StudentList ls;
  ls.insertValue("Falcao",45,1.87);
  ls.insertValue("Jacob",97,3.87);
  ls.list();
}

проблема в функии лист..

Answer 1

У Вас переменная student в методе list проверяется в цикле, но не меняется. Вместо неё меняется поле temp. По идее, нужно заменить temp=temp->next; на что-то вроде student=student->next;. Это то, что сразу бросается в глаза. А чтобы не было именно утечки памяти (seg fault - это не утечка, это попытка обращения к памяти, к которой у программы нет доступа), нужно деструктор для класса StudentList написать. Чтобы он по очереди удалял всех студентов.

READ ALSO
C++ 14 constexpr std::array

C++ 14 constexpr std::array

Изучаю constexprНе могу понять, почему компилятор не рассматривает одно из выражений как константное, потому что оно подходит под требования

129
CryptEncodeObjectEx segfault при обращении

CryptEncodeObjectEx segfault при обращении

CryptEncodeObjectEx разваливается при обращении, параметры не влияют, как выяснилосьСобираю gcc-tdm, через Code::Blocks, что опробовано:

128
Определение pure virtual function

Определение pure virtual function

Недавно обнаружил, что можно дать определение для pure virtual function вне класса:

131