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 该数组的值时,即使指针指向不再有效的数据,数据仍然存在。
这是如何工作的,数据是否被复制?这安全吗还是会导致问题?
在这个函数中:
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 在另一个答案中所说的话(并添加我自己的答案)
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |