I'm trying to free up memory whenever possible, but I keep triggering breakpoints when calling delete. It's been awhile since I've done c++ so I don't remember the exact way to do this.
main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
    LIFO lifo = *new LIFO();
    LIFO::Element element1  = *new LIFO::Element(1);
    LIFO::Element element2  = *new LIFO::Element(2);
    LIFO::Element element3  = *new LIFO::Element(3);
    LIFO::Element element4  = *new LIFO::Element(4);
    LIFO::Element element5  = *new LIFO::Element(5);
    LIFO::Element element6  = *new LIFO::Element(6);
    lifo.Push(element1);
    lifo.Push(element2);
    lifo.Push(element3);
    lifo.Push(element4);
    lifo.Push(element5);
    lifo.Push(element6);
    lifo.Peek(lifo.mSize);
    lifo.Pop();
    lifo.Pop();
    lifo.Pop();
    lifo.Peek(lifo.mSize);
    lifo.Push(element1);
    lifo.Push(element2);
    lifo.Push(element3);
    lifo.Push(element4);
    lifo.Push(element5);
    lifo.Push(element6);
    lifo.Peek(lifo.mSize);
    lifo.Empty();
    lifo.Peek(lifo.mSize);
    return 0;
}
LIFO.h
class LIFO
{
public:
    unsigned int mSize;
    LIFO(void)
        :mSize(0)
    {
        mTop = nullptr;
    }
    ~LIFO(void)
    {
    }
    class Element
    {
    public:
        Element* mNextElement;
        int mData;
        Element()
            :mData(0)
            ,mNextElement(nullptr)
        {
        }
        Element(int data)
            :mData(data)
            ,mNextElement(nullptr)
        {
        }
        ~Element()
        {
        }
    };
    Element* mTop;
    void Push(Element& element)
    {
        if(mTop != nullptr)
        {
            Element* newElement = &element;
            newElement->mNextElement = mTop;
            mTop = newElement;
            delete newElement;
            newElement = nullptr;
        }
        else
        {
            mTop = &element;
        }
        ++mSize;
    }
    void Pop()
    {
        if(mTop != nullptr)
        {
            Element* oldElement = mTop;
            mTop = mTop->mNextElement;
            --mSize;
            delete oldElement;
            oldElement = nullptr;
        }
    }
    void Empty()
    {
        while(mTop != nullptr)
        {
            Pop();
        }
    }
    void Peek(unsigned int depth)
    {
        Element* current = mTop;
        for(unsigned int i = 0; i < depth; ++i)
        {
            if(current != nullptr)
            {
                std::cout << current->mData << '\n';
                if(current->mNextElement != nullptr)
                {
                    current = current->mNextElement;
                }
                else
                {
                    break;
                }
            }
            else
            {
                break;
            }
        }
        delete current;
        current = nullptr;
    }
};
I also tried these in the destructors at one point and they didn't work right either
~LIFO(void)
{
    Element* current = mTop;
    while(current != nullptr)
    {
        Element* next = current->mNextElement;
        delete current;
        current = next;
    }
    current = nullptr;
}
How do I safely free up memory in this stack?
 
    