Hi!
@rewb0rn:
Richtig was du da sagst, allerdings ist ein Macro keine besonders gute Lösung. Nehmen wir mal folgendes an:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
|
std::vector< int* > IntList;
for ( int i = 0; i < 10; ++i )
{
IntList.push_back( new int( i ) );
}
std::vector< int* >::iterator it( IntList.begin() );
for ( ; it != IntList.end(); ++it )
DELETEP( *it );
|
Alles schön und gut, oder? Dummerweise werden die Zeiger hier nicht auf NULL gesetzt. Leider treten so Fehler nur zu häufig auf und Aufgrund des wirklich bescheuerten Debugaufwandes sollte man soweit wie Möglich auf Macros verzichten.
Es geht schließlich auch mit Funktionen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
template< typename T >
inline void DeletePtr( T*& ptr )
{
delete ptr;
ptr = 0;
}
// ...
std::vector< int* > IntList;
for ( int i = 0; i < 10; ++i )
{
IntList.push_back( new int( i ) );
}
std::vector< int* >::iterator it( IntList.begin() );
for ( ; it != IntList.end(); ++it )
DeletePtr( *it );
|
Und schon ist das Problem gegessen, dank Referenz auf einen Zeiger. Natürlich würde es auch ein Doppelzeiger tun, aber die Lösung per Referenz ist doch etwas schöner und näher an C++.
@Draculark:
Im Grunde ist das eine recht heikle Angelegenheit die du da machen willst. Was wenn du ein Objekt löschst und dann (ausversehen) trotzdem nochmal auf die Instanz zugreifen willst? Dann hast du ein richtiges Problem, nämlich im schlimmsten Fall ein Programmabsturz.
Also solltest du dir doch lieber eine Alternative suchen, z.B. über eine Funktion oder du schreibst dir einen Objektmanager.
grüße