gpt4 book ai didi

c++ - 删除指向派生类的指针时指定给 RtlValidateHeap 的地址无效

转载 作者:搜寻专家 更新时间:2023-10-31 00:58:02 26 4
gpt4 key购买 nike

我在我正在处理的 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()
{
}

测试状态.h

#pragma once
#include "State.h"
#include <iostream>

class TestState : public State
{
public:
TestState();
~TestState();

void Init();
void Deinit();
void Reinit();
};

测试状态.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()
{
}

当指针被删除时,StateTestState 的析构函数都会被调用。

提前致谢。

最佳答案

因为你正在删除堆栈中的一些东西。当您将指针分配给局部变量的引用时,您将指针分配给堆栈中分配的实体。不能使用用于堆变量的“删除”来删除它。此外,您还泄漏了新分配的内容。

    TestState test;

State *state = new State();
state = &test; //Now it points to the test which is in the stack

state->Init();

delete state; //Delete something in the stack. Not good.

像这样的东西应该会更好。

   TestState test;

State *state = &test;

state->Init();

关于c++ - 删除指向派生类的指针时指定给 RtlValidateHeap 的地址无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com