Verwenden Sie intelligente Zeiger wie Boost shared_ptr
? Wenn ja, überprüfen Sie durch Aufrufen, ob Sie den Rohzeiger irgendwo direkt verwenden get()
. Ich habe festgestellt, dass dies ein recht häufiges Problem ist.
Stellen Sie sich beispielsweise ein Szenario vor, in dem ein Rohzeiger (z. B. als Callback-Handler) an Ihren Code übergeben wird. Sie können dies einem intelligenten Zeiger zuweisen, um mit der Referenzzählung usw. fertig zu werden. Großer Fehler: Ihr Code besitzt diesen Zeiger nur, wenn Sie eine tiefe Kopie erstellen. Wenn Ihr Code mit dem Smart Pointer fertig ist, wird er zerstört und versucht, den Speicher zu zerstören, auf den er verweist, da er denkt, dass niemand anderes ihn benötigt, aber der aufrufende Code versucht dann, ihn zu löschen, und Sie erhalten ein Double freies Problem.
Das könnte hier natürlich nicht Ihr Problem sein. Am einfachsten ist hier ein Beispiel, das zeigt, wie es passieren kann. Das erste Löschen ist in Ordnung, aber der Compiler erkennt, dass dieser Speicher bereits gelöscht wurde, und verursacht ein Problem. Aus diesem Grund ist es eine gute Idee, einem Zeiger unmittelbar nach dem Löschen 0 zuzuweisen.
int main(int argc, char* argv[])
{
char* ptr = new char[20];
delete[] ptr;
ptr = 0;
delete[] ptr;
}
Bearbeiten: geändert delete
in delete[]
, da ptr ein Array von Zeichen ist.
NULL
Zeiger vorschlägt (die Fehler maskieren, die sonst abgefangen werden, wie diese Frage gut zeigt), aber niemand schlägt vor, einfach überhaupt keine manuelle Speicherverwaltung durchzuführen, was in C ++ sehr gut möglich ist. Ich habe seit Jahren nicht mehr geschriebendelete
. (Und ja, mein Code ist leistungskritisch. Sonst wäre er nicht in C ++ geschrieben worden.)