Q:

Differences between declaring a variable in a header file as pointer and non-pointer

What are the differences between declaring a variable in a header file as pointer or non-pointer? I am not sure if I understand the differences correctly.
E.g.
class MyClass {

private:
    MyOtherClass* moc; // pointer
    MyOtherClass moc2; // no pointer
}

So far I have come up with the following advantages/disadvantages when declaring a variable as pointer.
Advantages:

Lazy instantiation (no immediate creation of the object)
Variable lives on the heap which is much larger than the stack
Not only the default constructor can be used

Disadvantages:

Must be deleted manually in the destructor (btw. when is such a non-pointer variable destructed? When the program ends?)

What else is there to say?

A:

Having an object signifies ownership. It's composition. Pointers can signify ownership, but most of the time they mean aggregation.
I.e. MyClass has a moc2 and uses moc.
Take your decision thinking about the design of the classes and how they interact with each other, not based on the pointer vs. object debate. Each MyClass object will have its own moc2 member, but multiple MyClass objects can share a moc between them.
Regarding your proposed advantages/disadvantages:
Advantages:

Lazy instantiation (no immediate creation of the object) - the pointer itself is initialized - remember your member is a pointer not an object. But I'll give you that you sometimes need this, although it's most of the time a code-smell.
Variable lives on the heap which is much larger than the stack - not necessarily - you can have a pointer to a stack-based variable as well. Also, if a MyClass object is allocated on the heap, so will moc2.
Not only the default constructor can be used - non-issue, you can use any constructor in both cases (see initialization-lists).

Disadvantages:

Must be deleted manually in the destructor (btw. when is such a non-pointer variable destructed? When the program ends?) - only if MyClass owns the member - it could be a pointer to some object created elsewhere, so MyClass isn't responsible for managing it.

