【问题标题】:Can't get the same value of a pointer using the value of a pointer to pointer?无法使用指向指针的指针的值获得相同的指针值?
【发布时间】:2020-07-20 13:59:39
【问题描述】:

程序崩溃。我正在尝试实现一个 Brick ** create_bricks() 函数,该函数返回一个指向 Brick 指针的指针(因为我想创建一个 Bricks 数组并返回第一个的位置)。我把头发拉出来,在几次尝试失败、错误和研究之后,我做的最后一件事是简化我的代码并逐行检查指针的值。当我在绘图函数游戏循环中将the_brick 取消引用为*the_brick 时,它不会获得与new Brick()create_bricks() 函数内分配给ptr_brick 的值相同的值。我正在使用 SFML,但问题在于指针。

注意:如果我从 create_bricks 返回一个 Brick * 并进行适当的修改,它可以正常工作(并绘制砖块),但我需要创建多个砖块,而不仅仅是一个。

#include "Brick.h"

int main()
{
    ...

    while (window.isOpen())
    {
        Brick ** ptr_bricks = create_bricks();
        Brick * ptr_brick = *ptr_bricks;
        window.draw(*the_brick);
    }
    return 0;
}
Brick ** create_bricks()
{
    Brick * ptr_brick = new Brick();
    ptrBrick->setPosition(150, 20);
    return &ptrBrick;
}
#include "Brick.h"

Brick::Brick()
{
    LOG(INFO) << "Brick constructor";

    setPosition(10, 10);
    setSize(sf::Vector2f(100, 20));
    setFillColor(sf::Color::Green);
    setOutlineThickness(1);
}

Brick::~Brick()
{
    LOG(INFO) << "Brick destructor";
    //dtor
}

谢谢

【问题讨论】:

  • 返回Brick * 不会阻止您创建多个砖块。
  • @bipll 是的,但更不安全。
  • 至少不是UB。

标签: c++ pointers sfml


【解决方案1】:

问题在于create_bricks函数中的return语句:

return &ptrBrick;

在这里,您返回一个指向 local 变量 ptrBrick 的指针。这个变量的生命周期将在函数结束时结束,任何指向它的指针都会在函数结束时失效。

从函数返回“数组”的自然 C++ 解决方案是返回 std::vector

std::vector<Brick*> create_bricks()
{
    Brick* brick = new Brick;
    brick->setPosition(150, 20);
    return { brick };
}

如果Brick 不是多态类,您甚至不需要使用指针向量,而是使用普通Brick 对象的向量 (std::vector&lt;Brick&gt;)。

如果你坚持使用指针,你必须分配一个指向Brick的指针数组,这意味着new Brick*[number_of_bricks](或者new Brick[number_of_bricks],如果不需要多态性)。

【讨论】:

  • 返回一个 std::vector 就像一个魅力。你给我的最后一个解决方案(分配一个数组)是那个会引导我得到我正在等待的结果的解决方案。首先更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2011-08-04
  • 2012-03-23
相关资源
最近更新 更多