C++ 什么是指针的作用域?

zma*_*mac 1 c++ memory arrays pointers scope

这里我有一些 C++ 代码都在 1 个 cpp 文件中:

struct Object
{
    int* data;
}

Object obj;

void pizza()
{
    int joe[] = {5, 3, 4, 7, 8};
    obj.data = joe;
}

int main()
{
    pizza();
    std::cout << obj.data[2];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

obj.data只是一个指向int数组的指针,我在pizza函数中初始化它,所以当它离开这个函数时,obj.data应该指向NULL,因为这个数据只存在于pizza的范围内。

但情况并非如此,当我 std::cout 该数组的值时,即使指针指向不再有效的数据,数据仍然存在。

这是如何工作的,数据是否被复制?这安全吗还是会导致问题?

pm1*_*100 7

在这个函数中:

void pizza()
{
    int joe[] = {5, 3, 4, 7, 8};
    obj.data = joe;
}
Run Code Online (Sandbox Code Playgroud)

joe 仅在该函数运行时存在;它是在堆栈上分配的。一旦披萨吃完,该内存就会自动释放,但您已将 joe 的地址保存在 obj.data 中。这意味着 obj.data 现在指向无效内存。

它之所以“有效”,是因为你“幸运”;读取该指针无效,触发所谓的“未定义行为”,又名 UB。在某些情况下(最难调试的情况),一切似乎都正常,但稍后当您更改某些内容(或客户下了意外的大订单)时,它就会失败。

在你的情况下,尝试重复 std::cout,它可能会给你一个不同的答案。

我将回应 Ted Lyngmo 在另一个答案中所说的话(并添加我自己的答案)

  • 不要使用原始指针,使用 std::shared_ptr 或 std::unique_ptr
  • 不要使用原始数组,使用 std::vector