c++ - 这是某种指针错误吗?

标签 c++ class pointers crash polymorphism

我在业余时间正在开发一款小型游戏,在编写代码时遇到了一个问题。

我已经隔离了问题,并在此处将其缩小到了尽可能小:

#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};
    }
};

关于c++ - 这是某种指针错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40942591/

相关文章:

c++ - 运算符重载

使用递归函数反转字符串的概念

python - 在main中的Label中写入类变量

c++ - 当我在 C++ 中对未初始化的指针调用 "delete"时会发生什么?

C - 使用指向字符数组的指针打印网格

c++ - char * 与 std string 比较错误结果

c++ - 仅存储一个 int 的指针的静态与动态分配

c++ - 为什么 Linux 上的 C++ 重整不是唯一的

java - 为什么 Class.forName() 对我不起作用?

python - 如何使父类(super class)独有的类属性