Skip to main content
 首页 » 编程设计

c++之这是某种指针错误吗

2025年05月04日45虾米哥

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

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

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