Well, this might just be opinion, but I will try to justify the opinion.
I consider the use of the -> in your second example to be more idiomatic. It is immediately clear to a skilled c++ reader what you are doing.
By turning the pointer into a reference in snippet three you are inserting (imho) a useless line of code whose only benefit is to soothe anyone who is disturbed by the use of the -> operator.
If the pointer is not assigned, you will get the same error when you attempt to turn into a reference as you will when you try to use it. So it accomplished nothing. So in my opinion the code neither accomplishes anything, nor clarifies the code -- this makes is noise, not signal, and in a code review I would suggest removing it.
Given your constraint that you have to allocate on the heap, and only have auto_ptr available, I find your second solution to be the correct one. To assure the reader of the code that the the pointer is assumed to be assigned, I recommend to follow guideline 68 from "C++ Coding Standards" (Sutter & Alexandrescu -> and excellent read), which states "Assert liberally to document internal assumptions and invariants.".
Thus immediately after initializing your (auto) pointer, include the line:
assert(lines);
This acts as documentation to anyone reading your code that you are reasonably certain no uninitialized pointers will be reaching that point of the code, and it serves as a debug (not release) time test that your assumptions are valid. Win win.