【发布时间】:2017-04-17 23:27:02
【问题描述】:
我在空闲时间开发一个小游戏,在编写代码时遇到了一个问题。
我已经隔离了这个问题,并在此处尽可能小:
#include <iostream>
#include <memory>
#include <vector>
#include <Windows.h>
class Base
{
public:
std::string p;
virtual ~Base()
{
}
virtual std::vector<std::shared_ptr<std::string>> getText() = 0;
};
class Derived1 : public Base
{
public:
Derived1()
{
p = "from1";
}
std::vector<std::shared_ptr<std::string>> getText()
{
return std::vector<std::shared_ptr<std::string>>{std::shared_ptr<std::string>(&p)};
}
};
class Derived2 : public Base
{
public:
Derived2()
{
p = "from2";
}
std::vector<std::shared_ptr<std::string>> getText()
{
return std::vector<std::shared_ptr<std::string>>{std::shared_ptr<std::string>(&p)};
}
};
int main()
{
std::unique_ptr<Base> state;
std::vector<std::shared_ptr<std::string>> displayText;
state.reset(new Derived1());
displayText = state->getText();
while(1)
{
for(auto i = displayText.begin(); i != displayText.end(); ++i)
std::cout << **i;
if (GetKeyState('2') < 0)
{
state.reset(new Derived2());
displayText.clear();
displayText = state->getText();
}
else if (GetKeyState('1') < 0)
{
state.reset(new Derived1());
displayText.clear();
displayText = state->getText();
}
}
return 0;
}
当来回按“1”和“2”时,有时它似乎可以工作,当我退出时,我得到类似 -1073741510 或类似返回值的东西。在我的游戏代码中,它似乎也经常崩溃。
(退出我的意思是使用命令窗口上的 X 按钮,抱歉没有澄清)
在对 unique_ptr 和一般指针以及多态类进行了一些研究之后,我仍然不明白为什么会这样。
那么,这里发生了什么?
【问题讨论】:
-
定义“退出”。显示的代码没有提供干净地终止程序的方法。它在无限循环中运行。
-
@SamVarshavchik 已修复,抱歉没有澄清
标签: c++ class pointers crash polymorphism