I am having some trouble with memory leak in a class I wrote. First, I
measured the virtual memory used, then a run a test sequence and tried
to release the memory.
PS.:The main purpose here is to avoid memory
leak, so the virtual memory should be freed, but It is not happening.
The result of the test was:
VETOR mem: 7045873664 -> virtual memory used before operation
[1.0000000 2.0000000 3.0000000 4.0000000 ] [1.0000000 2.0000000 3.0000000 4.0000000 ] [2.0000000 4.0000000 6.0000000 8.0000000 ] [3.0000000 5.0000000 7.0000000 9.0000000 ] [0.0000000 0.0000000 0.0000000 0.0000000 ] [30.0000000 ]
VETOR mem: 7077228544 -> virtual memory used after operation
- this was done in VS2015 com. in Release Mode
The code of test was:
Vector A,B,C;
A = { 1, 2, 3, 4 };
B = A;
A.Print();
B.Print();
for (int i = 0; i < 500000; i++)
{
    C = A + B;
}
C.Print();
(C + 1.0).Print();
(A - B).Print();
(A*B.Transpose()).Print();
A.~Vector();
B.~Vector();
C.~Vector();
The class Vector is describe bellow:
class Vector
{
private:
int size;
long double *p;
public:
Vector()
{
    size = 0;
    p = NULL;
}
~Vector()
{
    if (p != NULL)
    {
        delete[] p;
        p = NULL;
    }
}
Vector(const int r)
{
    if (r > 0)
    {
        size = r;
        p = NULL;
        p = new long double[size];
        for (register int i = 0; i < size; i++)
        {
            //p[i] = new long double[1];
            p[i] = 0.;
        }
    }
}
// construtor cópia      
Vector(const Vector& v)
{
    size = v.size;
    p = NULL;
    p = new long double[size];
    for (register int i = 0; i < size; i++)
    {
        //p[i] = new long double[1];
        p[i] = v.p[i];
    }
}
// Initialize to array
Vector(const long double* a, int n)
{
    size = n;
    p = NULL;
    p = new long double[size];
    for (register int i = 0; i < size; i++)
    {
        //p[i] = new long double[1];
        p[i] = *a++;
    }
}
template <typename T, size_t n>
Vector(const  T(&a)[n])
{
    size = n;
    p = NULL;
    p = new long double[size];
    for (register int i = 0; i < size; i++)
    {
        p[i] = a[i];
    }
}
long double& operator()(const int r)
{
    if (p != NULL && r > 0 && r <= size)
    {
        return p[r - 1];
    }
    else
    {
        throw Exception("Subscript out of range");
    }
}
long double& operator()(const int r) const
{
    if (p != NULL && r > 0 && r <= size)
    {
        return p[r - 1];
    }
    else
    {
        throw Exception("Subscript out of range");
    }
}
// assignment operator
Vector& operator= (const Vector& v)
{
    try
    {
        if (p != NULL)
        {
            delete[] p;
            p = NULL;
        }
        size = v.size;
        if (p == NULL) p = new long double[v.size];
        for (register int i = 0; i < v.size; i++)
        {
            p[i] = v.p[i];
        }
    }
    catch (exception& e)
    {
        cout << "Vector operator=: Standard exception: " << e.what() << endl;
    }
    return *this;
}
template <typename T, size_t n>
Vector& operator= (const T(&a)[n])
{
    if (p != NULL)
    {
        delete[] p;
        p = NULL;
    }
    size = n;
    p = new long double[size];
    for (register int i = 0; i < size; i++)
    {
        p[i] = a[i];
    }
    return *this;
}
Vector& operator= (const long double& k)
{
    try
    {
        if (p != NULL)
        {
            delete[] p;
            p = NULL;
        }
        if (p == NULL)  p = new long double[size];
        for (register int i = 0; i < size; i++)
        {
            // copy the values from the vector v
            //p[i] = new long double[1];
            p[i] = k;
        }
    }
    catch (exception& e)
    {
        cout << "Vector operator=: Standard exception: " << e.what() << endl;
    }
    return *this;
}
friend Vector operator+(const Vector& a, const Vector& b)
{
    Vector Nulo(a.size);
    Nulo = 0.0;
    if (a.size == b.size)
    {
        Vector res(a.size);
        for (register int i = 0; i < a.size; i++)
        {
            res.p[i] = a.p[i] + b.p[i];
        }
        return res;
    }
    else
    {
        throw("Subscript out of range");
    }
    return Nulo;
}
// soma de escalar + vetor : somar a todos os elementos
friend Vector operator+(const long double& a, const Vector& b)
{
    Vector res(b.size);
    Vector Nulo(b.size);
    //res = Vector(b.size);
    //res.size = b.size;
    res = 0.0;
    for (register int i = 0; i < b.size; i++)
    {
        res.p[i] = a + b.p[i];
    }
    return res;
}
// soma de  vetor + escalar : somar a todos os elementos
friend Vector operator+(const Vector& b, const long double& a)
{
    Vector res, Nulo;
    res = Vector(b.size);
    res.size = b.size;
    res = 0.0;
    for (register int i = 0; i < b.size; i++)
    {
        res.p[i] = a + b.p[i];
    }
return res;
    }
}
class Exception
{
public:
    const char* msg;
    Exception(const char* arg)
        : msg(arg)
    {
    }
};
