0

我正在将 Raylib GUI 框架用于显示 Collat​​z 猜想迭代中的所有节点的项目。在我的程序中,我有一个Node对象类,它只是一个带有标记数字的圆圈。text但是,我的方法中的变量draw有问题;C26815: The pointer is dangling because it points at a temporary instance which was destroyed. 我是 C++ 新手,目前没有任何书籍可以教我,因此我不完全确定“悬空”指针是什么或它的含义,但我相当确定这是原因我无法在我的节点上显示任何文本。这是我的Node课:

class Node {
private:
    int x;
    int y;
    int value;
    int radius;
public:
    Vector2 get_pos() {
        return Vector2{ (float)x, (float)-value * 25 };
    }

    void set_radius(int newRadius) {
        radius = newRadius;
    }
    
    void set_value(int newValue) {
        value = newValue;
    }

    void set_x(int newX) {
        x = newX;
    }

    void set_y(int newY) {
        y = newY;
    }

    void draw() {
        
        if (value) {
            const char* text = std::to_string(value).c_str();
            Vector2 size = MeasureTextEx(GetFontDefault(), text, 32.0f, 0.0f);
            Vector2 pos = get_pos();
            DrawCircle(pos.x, pos.y, radius, WHITE);
            DrawText(text, pos.x - size.x / 2, pos.y - size.y / 2, 32, BLACK);
        }
    }
};

任何有关正在发生的事情的帮助或解释将不胜感激。

编辑:其他人在其他问题上也有类似的问题,但没有一个答案对我有意义或不适用于我的情况。

4

1 回答 1

1

在这一行

const char* text = std::to_string(value).c_str();

您正在调用c_str()which 返回指向由 . 返回的临时缓冲区的指针std::to_string(value)。此临时生命周期在此行的末尾结束。从返回的指针c_str仅在字符串仍然存在时才有效。

如果DrawText复制字符串(而不仅仅是复制您传递的指针),您可以通过以下方式修复它

        std::string text = std::to_string(value);
        Vector2 size = MeasureTextEx(GetFontDefault(), text, 32.0f, 0.0f);
        Vector2 pos = get_pos();
        DrawCircle(pos.x, pos.y, radius, WHITE);
        DrawText(text.c_str(), pos.x - size.x / 2, pos.y - size.y / 2, 32, BLACK);
于 2022-03-03T10:48:29.573 回答