Ich habe ein Problem mit Polymorphismus in einem C++ - Projekt, an dem ich arbeite. Ich habe eine Basisklasse mit dem Namen State, und eine abgeleitete TestState Klasse. Ich versuche, eine virtuelle Funktion aufzurufen, die in der abgeleiteten Klasse von einem State Zeiger überschrieben wird. Die virtuelle Funktion aufgerufen wird, aber beim Löschen des Zeigers ich die folgende Fehlermeldung erhalten:Ungültige Adresse für RtlValidateHeap beim Löschen des Zeigers auf abgeleitete Klasse
Invalid address specified to RtlValidateHeap(00FF0000, 0018FD74)
Nach anderen Antworten sucht Ich habe in der Lage zu verstehen, dass dies bedeutet, dass der Heap beschädigt ist, aber keine der Lösungen Ich habe gefunden, dass ich für mich gearbeitet habe.
Dies ist der Code, den ich laufen:
int main()
{
TestState test;
State *state = new State();
state = &test;
state->Init();
delete state;
}
State.h
#pragma once
#include <iostream>
class State
{
public:
State();
virtual ~State();
virtual void Init();
virtual void Reinit();
virtual void Deinit();
};
State.cpp
#include "State.h"
State::State()
{
}
State::~State()
{
std::cout << "Destroying State!" << std::endl;
}
void State::Init()
{
std::cout << "Initialized State!" << std::endl;
}
void State::Deinit()
{
}
void State::Reinit()
{
}
TestState.h
#pragma once
#include "State.h"
#include <iostream>
class TestState : public State
{
public:
TestState();
~TestState();
void Init();
void Deinit();
void Reinit();
};
TestState.cpp
#include "TestState.h"
TestState::TestState()
{
}
TestState::~TestState()
{
std::cout << "Destroying TestState!" << std::endl;
}
void TestState::Init()
{
std::cout << "Initialized TestState!" << std::endl;
}
void TestState::Deinit()
{
}
void TestState::Reinit()
{
}
Der Destruktor von sowohl Staat und Teststate wird aufgerufen, wenn der Zeiger gelöscht wird.
Vielen Dank im Voraus.
Sie vermissen Copy/Move Konstruktoren/Zuweisungsoperatoren! – o11c
Entschuldigung, ich bin neu in C++, kannst du erklären, warum ich sie in diesem Fall brauchen würde? – Dramentiaras
Es heißt die "Regel von 3" oder "Regel von 5". Wenn Sie * an * des Konstruktors destruktor, copy/move, Zuweisungsoperator kopieren/verschieben definieren, müssen Sie * all * davon definieren. Beachten Sie, dass gelöschte Definitionen weiterhin zählen (z. B. für Nur-Verschiebe-Klassen). – o11c