Pregunta

En un mundo en el manual de asignación de memoria y punteros todavía regla (Borland Delphi) necesito una solución general para lo que creo que es un problema general:

En un momento dado, un objeto puede ser referenciada desde múltiples lugares (listas, otros objetos, ...).Hay una buena manera de mantener un seguimiento de todas estas referencias para que yo pueda actualizarlos cuando el objeto es destruido?

¿Fue útil?

Solución

Si desea notificar a otros de los cambios que deben implementar las "Patrón Observer".Delphi ya ha hecho por usted para TComponent descendientes.Usted puede llamar a la TComponent.FreeNotification método y tiene su objeto de ser notificados cuando el otro componente es destruido.Se hace llamando al método de Notificación.Usted puede eliminar de la lista de notificación llamando TComponent.RemoveFreeNotification.Ver también esta página.

La mayoría de los Recolectores de Basura no permiten obtener una lista de referencias, por lo que no ayuda en este caso.Delphi puede hacer referencia a contar si a usted le interfaces de uso, pero de nuevo, usted necesita para mantener un seguimiento de las referencias a sí mismo.

Otros consejos

No puedo entender por qué querrías hacer esto.Seguramente usted acaba de comprobar una referencia en no Nil antes de usarla?

Anwyays, dos posibles soluciones, me volvería a considerar son:

  1. Tienen objetos de administrador de sus propios recuentos de referencia.
  2. Crear un conteo de referencia del administrador de la clase.

Probablemente voy a agregar a AddRef() y ReleaseRef() funciones para el administrador o la referencia consciente de la clase.Usted puede utilizar estas para comprobar cómo existen muchas referencias en cualquier momento.COM hace de esta manera.

La referencia consciente de la clase administrar su propia cuenta de referencia.El gerente podría usar un Mapa para asociar los punteros con un número entero para contar.

Estás tratando de seguir la pista de quién es la referencia a un objeto para que pueda borrar las referencias cuando se destruye el objeto, o que están tratando de mantener un seguimiento de cuándo es seguro para destruir el objeto?

Si lo segundo, suena como que usted está buscando un recolector de basura.Nunca he tratado con Delphi, así que no sé si hay GCs para que usted puede utilizar, pero me sorprendería si no las había.

Si lo primero, un GC probablemente no sería de ayuda.Si Delphi soporta la programación orientada a objetos/inheritence (sinceramente, no sé si lo hace), se podría hacer algo como esto (pseudocódigo):

// Anything that will use one of your tracked objects implements this interface
interface ITrackedObjectUser {
  public void objectDestroyed(TrackedObject o);
}

// All objects you want to track extends this class
class TrackedObject {
  private List<ITrackedObjectUser> users;

  public void registerRef(ITrackedObjectUser u) {
    users.add(u);
  }

  public void destroy() {
    foreach(ITrackedObjectUser u in users) {
      u.objectDestroyed(this);
    }
  }
}

Básicamente, cada vez que agregue uno de su seguimiento de objetos a una colección que la colección le registrarse con ese objeto.Cuando el objeto se destruye (se me figura que se llama destruir() en el destructor del objeto) el objeto de las señales de la colección que está siendo destruida por lo que la recolección se puede hacer lo que se necesita.

Por desgracia, esta no es realmente una buena solución si desea utilizar la acumulación en las colecciones.Habría que escribir su propia colección de objetos (que sólo podría envolver construir-en aunque).Y que requeriría para asegurarse de que usted está registrando en todas partes que desea realizar un seguimiento del objeto.No es lo que yo considero un "feliz", aunque para proyectos más pequeños, probablemente no sería tan malo.Estoy principalmente con la esperanza de que esta idea ayudará a desovar otras ideas.:)

Hay una razón específica por la que quieres esto?Están ejecutando en problemas con rogue punteros, o estás pensando que podría ser un problema de un día?

En mi humilde opinión no será un problema si el diseño de su aplicación a la derecha, y el uso de los patrones adecuados realmente ayuda.

Un poco de información acerca de los patrones:

http://delphi.about.com/od/oopindelphi/a/aa010201a.htm

http://www.obsof.com/delphi_tips/pattern.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top