¿Hay alguna forma estándar de indicar que una función devuelve un nuevo puntero?
No, no existe una "forma estándar" (pero hay una política de diseño de API actualmente considerada "mejor práctica").
Debido a esta ambigüedad ("¿qué quiere que haga una función que devuelve un puntero?"), Actualmente se considera la mejor práctica imponer la política de vida y propiedad, a través del tipo de devolución:
<vertex pointer type> new_vertex(const Options& options);
<vertex pointer type>
puede ser std::unique_ptr
("new_vertex no posee el puntero"), o std::shared_ptr
("el código del cliente no posee el puntero"), o algo más, que tenga una semántica de propiedad claramente definida (por ejemplo, Vertex const * const
indicaría al código del cliente "leer el dirección y valores, pero no cambie ninguno / no elimine el puntero ").
En general, no debe devolver un puntero sin formato (pero en algunos casos, "la practicidad es mejor que la pureza").
TLDR : hay una mejor práctica ( sí ), pero no una forma estándar (en el idioma).
Editar :
donde la función solo está destinada a ser utilizada dentro de una clase que posee Vertex
Si la clase posee el Vértice, lo escribiría así:
class SomeClass // owns the vertex
{
void do_stuff() // uses the vertex internally
{
init_vertex(); // see below
assert(vertex.get());
// use vertex as needed
}
private:
// "class owns the Vertex"
std::unique_ptr<Vertex> vertex;
// sets the internal vertex
// function doesn't return a pointer of any kind
void init_vertex(const Options& options); // or "reset_", "refresh_",
// or "make_" vertex,
// if the pointer can change
// throughout the lifetime
// of a SomeClass instance
};
// TODO: Fix allocation of raw pointer.
unique_ptr
llamando a surelease()
función, y usar los punteros en bruto como en las viejas formas.// FIXME: Allocation of raw pointer
?new_vertex
así que sé que el objeto está recién acuñado. Podrías llamarloCreate_new_vertex
para ser más claro. En cuanto a la idea de que no se debe gestionar la memoria heap sin punteros inteligentes, nunca había visto la verdad porque - de hecho, si usted no puede manejar la pila de memoria y sin ellos, no tienes negocio la gestión de memoria del montón con ellos, ya sea!