【发布时间】:2016-07-13 18:26:08
【问题描述】:
我正在处理的 C++ 项目中存在多态性问题。我有一个名为 State 的基类和一个派生的 TestState 类。我正在尝试从 State 指针调用在派生类中重写的虚函数。调用了虚函数,但是在删除指针时出现以下错误:
Invalid address specified to RtlValidateHeap( 00FF0000, 0018FD74 )
在搜索其他答案后,我已经能够理解这意味着堆已损坏,但我找到的解决方案都没有为我工作。
这是我正在运行的代码:
int main()
{
TestState test;
State *state = new State();
state = &test;
state->Init();
delete state;
}
状态.h
#pragma once
#include <iostream>
class State
{
public:
State();
virtual ~State();
virtual void Init();
virtual void Reinit();
virtual void Deinit();
};
状态.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()
{
}
State 和 TestState 的析构函数都会在指针被删除时调用。
提前致谢。
【问题讨论】:
-
您缺少复制/移动构造函数/赋值运算符!
-
抱歉,我是 C++ 新手,你能解释一下为什么在这种情况下我需要它们吗?
-
它被称为“3 规则”或“5 规则”。如果定义 any of:析构函数、复制/移动构造函数、复制/移动赋值运算符,则必须定义它们的 all。请注意,已删除的定义仍然很重要(例如,对于仅移动类)。
标签: c++ pointers memory polymorphism heap-memory