c++ 指针指向的值超出作用域,指针中断[关闭]

nzkunb0c  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(106)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答这个问题。
2天前关闭。
Improve this question
代码如下。它是一个BFS,我想让它倒退,所以我尝试使用指针在步骤之间建立连接。
sx,sy是我们的起点。tx,ty是我们的命运点。act[][]是一个布尔表,以确保我不会两次进入同一个地方。

struct trip
{
    int first;
    int second;
    trip* last;
};

void write(trip a)
{
    cout<<"\n";
    cout<< "x" << " " << a.first << "\n";
    cout<< "y" << " " << a.second << "\n";
    cout<< "x lasta" << " " << a.last->first << "\n";
    cout<< "y lasta" << " " << a.last->second << "\n";
}

queue<trip> Q;
trip P; P.first = sx; P.second = sy; P.last = nullptr; Q.push(P);
while(!Q.empty())
{
    //cout << "WOW" << "\n";
    trip temp = Q.front(); Q.pop();
    if(temp.last != nullptr)
        write(temp);

    int corx = temp.first;  int cory = temp.second;

    if(corx == tx && cory == ty)
    {
        // We found our destiny
    }

    if(act[corx][cory] == false)
    {
        act[corx][cory] = true;

        // Up
        if(cory - 1 >= 0)
        {
            trip TEMPUUS; TEMPUUS.first = corx - 1; TEMPUUS.second = cory; TEMPUUS.last = &temp; Q.push(TEMPUUS);
            cout << corx - 1 << " " << TEMPUUS.last -> first; // corx - 1 here is equal to
            //TEMPUUS.last -> first - 1 and that is what I want
        }

        // Down
        if(cory + 1 <= 2000)
        {
            trip TEMPUUS; TEMPUUS.first = corx + 1; TEMPUUS.second = cory; TEMPUUS.last = &temp; Q.push(TEMPUUS);
        }

        // Left
        if(corx - 1 >= 0)
        {
            trip TEMPUUS; TEMPUUS.first = corx; TEMPUUS.second = cory - 1; TEMPUUS.last = &temp; Q.push(TEMPUUS);
        }

        // Right
        if(corx + 1 <= 2000)
        {
            trip TEMPUUS; TEMPUUS.first = corx; TEMPUUS.second = cory + 1; TEMPUUS.last = &temp; Q.push(TEMPUUS);
        }
    }
}

字符串
那有什么问题问题是,当我将一个trip变量推到队列中时,它的坐标与它的前身的坐标不同。然而,当我们进入队列的下一次迭代时,temp变量超出了作用域,“最后一个”指针现在指向它自己。


的数据
下面是一个代码示例:

#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

struct trip
{
    int first;
    int second;
    trip* last;
};

void write(trip a)
{
    cout << "\n";
    cout <<  "x" << " " << a.first << "\n";
    cout <<  "y" << " " << a.second << "\n";
    cout <<  "x lasta" << " " << a.last->first << "\n";
    cout <<  "y lasta" << " " << a.last->second << "\n";
}

void bfs(int sx, int sy, int tx, int ty)
{
    queue<trip> Q;
    trip P; P.first = sx; P.second = sy; P.last = nullptr; Q.push(P);
    int test = 0;
    while(!Q.empty())
    {
        trip temp = Q.front(); Q.pop();
        if(temp.last != nullptr)
            write(temp);
        int corx = temp.first;
        int cory = temp.second;

        if(act[corx][cory] == false)
        {
            act[corx][cory] = true;

            // Up
            if(cory - 1 >= 0)
            {
                trip TEMPUUS; TEMPUUS.first = corx - 1; TEMPUUS.second = cory; TEMPUUS.last = &temp; Q.push(TEMPUUS);
                cout << corx - 1 << " " << TEMPUUS.last -> first;
            }
        }
        test++;
        if(test > 5)
            return;
    }
}

int main()
{
    int sx, sy, tx, ty;
    cin >> sx >> sy >> tx >> ty;
    sx += 1000; sy += 1000; tx += 1000; ty += 1000;
    bfs(sx, sy, tx, ty);
    return 0;
}

zu0ti5jz

zu0ti5jz1#

temp结构在堆栈上分配,当定义它的块退出时,该内存再次被释放。这意味着排队的trip现在有一个无效的last引用。
相同的内存在循环的下一次迭代中被重用,使上面提到的last引用再次有效。但是现在对temp.first的赋值会影响 * 那个 * 内存。简而言之,所有非空的last成员引用 * 相同的 * 内存位置。
要解决这个问题,可以使用堆分配的内存(使用newclass等)。
您还应该注意释放已使用的内存。在您的例子中,与last的链接形成了一个树,这可能是一个相当大的负担。我建议将内存管理留给shared smart pointers
不是你的问题,而是:

  • 您的代码中有一个明显的错误。当注解和if条件指示“向上”移动时,您使用减小的x坐标而不是减小的y坐标来创建Trip
  • Why using namespace std; is considered bad practice
  • 不要把多个语句放在同一行上;当然,当需要向右滚动时(其中一个多语句行的长度超过110个字符)。幸运的是,使用构造函数消除了对其中一些的“需要”。

下面是struct tripwrite函数的替代:

class Trip
{
public:
    int first;
    int second;
    std::shared_ptr<Trip> last;

    Trip(int first, int second, std::shared_ptr<Trip> last) : 
            first(first), second(second), last(last)
    {
    }

    void write()
    {
        std::cout<<"\n";
        std::cout<< "x" << " " << this->first << "\n";
        std::cout<< "y" << " " << this->second << "\n";
        if (this->last) {
            std::cout<< "x lasta" << " " << this->last->first << "\n";
            std::cout<< "y lasta" << " " << this->last->second << "\n";
        }
    }
};

字符串
现在你的bfs函数看起来像这样:

void bfs(int sx, int sy, int tx, int ty)
{
    std::queue<std::shared_ptr<Trip>> Q;
    std::shared_ptr<Trip> start(new Trip(sx, sy, nullptr));
    Q.push(start);
    while (!Q.empty())
    {
        std::shared_ptr<Trip> current = Q.front();
        Q.pop();
        current->write();
        int corx = current->first;
        int cory = current->second;
        if (!act[corx][cory])
        {
            act[corx][cory] = true;
            //up
            if (cory - 1 >= 0)
            {
                std::shared_ptr<Trip> neighbor(new Trip(corx, cory - 1, current));
                Q.push(neighbor);
            }
        }
    }
}

相关问题