这是某种指针错误?
我在空闲时间正在进行一个小型游戏,并且在编码时遇到了一个问题。这是某种指针错误?
我已经分离出的问题,并使其尽可能小的位置:
#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一些研究和三分球后,我仍然无法理解为什么按照它的方式行事。
那么,这是怎么回事?
您正在从堆栈变量创建shared_ptr。这将最终调用p上的delete,这是不安全的。请参阅Calling delete on variable allocated on the stack
编辑: 您需要使p指针。您可以执行以下操作:
class Base
{
public:
std::shared_ptr<std::string> p;
virtual ~Base()
{
}
virtual std::vector<std::shared_ptr<std::string>> getText() = 0;
};
class Derived1 : public Base
{
public:
Derived1()
{
p = std::make_shared<std::string>("from1");
}
std::vector<std::shared_ptr<std::string>> getText()
{
return std::vector<std::shared_ptr<std::string>>{p};
}
};
class Derived2 : public Base
{
public:
Derived2()
{
p = std::make_shared<std::string>("from2");
}
std::vector<std::shared_ptr<std::string>> getText()
{
return std::vector<std::shared_ptr<std::string>>{p};
}
};
好吧,有无论如何我可以解决这个问题吗? –
您需要使p指针。你可以做类似如下: 'Base类 { 市民: \t的std :: shared_ptr的<:string>磷; \t虚拟〜基地(){} \t虚拟的std ::矢量>的getText()= 0; }; 类Derived1:公共基地 { 公共: \t Derived1() \t { \t \t p值=标准:: make_shared <:string>( “1跳转”); \t} \t的std ::矢量>的getText() \t { \t \t返回的std ::矢量> {P}; \t} };' –
是的,有一种方法。请参阅'shared_ptr'的文档。 –
定义“退出”。所示的代码没有提供干净地终止程序的方法。它运行在一个无限循环中。 –
@SamVarshavchik修好了,对不起,没有澄清 –