It depends. If the actual object is guaranteed not to go out of scope*, a raw pointer is sufficient. Otherwise, use a smart pointer; managing memory directly (via new/delete) is *never* acceptable- violating RAII is the surest path to undefined behavior! Anyway, I'd recommend using std::tr1::shared_ptr or the like.
*That can be trickier than it sounds. For example, if you store your objects in an std::vector, a pointer to one of it's elements could become invalidated once another object is added to the vector. On the other hand, an std::list would work fine. Point is, choose your data structure carefully, and be sure to RTFM.