Qui n'a jamais rencontré cette erreur ? Cette erreur que Windows signale est déclenchée par plusieurs actions différentes. Soit vous essayez de libérer de la mémoire déjà libérée, par exemple, le code suivant déclenchera une erreur de violation d'accès :
TForm1 *Form = new TForm1(this);
delete Form;
delete Form;
Pour éviter cette erreur, assignez NULL à vos pointeurs dès que vous avez utilisé delete. Ainsi, il n'y aura aucun risque. Cette erreur peut aussi arriver si l'appel à new rate. Dans ce cas, le delete essayera de supprimer un objet inexistant donc il y aura erreur. Pour parer à cette éventualité, assignez NULL à vos pointeurs dès leur déclaration :
TForm1 *Form = NULL;
Form = new TForm1(this);
// Si l'allocation avec new échoue, il n'y aura aucun problème
delete Form;
Enfin, cette erreur peut arriver si vous essayez d'accéder à une zone mémoire non allouée. Le cas typique est celui de la déclaration du pointeur mais aucune mémoire n'est allouée :
TEdit *Edit;
Edit->Parent = this; // Erreur : aucun appel à l'opérateur new n'a été fait !
On voit que l'attribution new NULL aux pointeurs permet de limiter les risques, mais cela ne doit pas être une solution à vos problèmes : il faut chercher pourquoi le pointeur est déréférencé plusieurs fois et l'éviter le plus possible, il faut chercher pourquoi la création d'un objet échoue, et enfin, il faut veiller à bien allouer la mémoire nécessaire avant d'utiliser un objet. On peut également noter que C++Builder est sujet aux violation d'accès dans l'IDE. Cependant, ces violations d'accès ne m'ont jamais fait perdre mon travail, bien que très désagréables.