给出以下代码:
void Allocate(int *p)
{
p = new int;
*p++ = 2;
}
int main()
{
int i = 10;
Allocate(&i);
std::cout << i << std::endl;
}
我有点担心的意思:
*p++ = 2;
输出为10
,我的理由是*p++
是临时的,因此Allocate(int *p)
范围的末尾会丢失对{{1}}的任何赋值。
是这样的吗? 谢谢你!
答案 0 :(得分:4)
Allocate
后,p
指向i
中的变量main
功能new int
。p
指针递增。Allocate
函数此时返回,泄漏的是int
分配i
函数中main
的值不变,
因为Allocate
没有修改它。答案 1 :(得分:3)
p = new int;
您指定p
新内存指向而不是之前指向的内容。然后,您更改此新分配的内存,并在函数结束时永久丢失,从而导致内存泄漏。如果删除分配行,则应该输出2.在这种情况下,++不执行任何操作。它只是递增指针并将旧值返回到取消引用。
答案 2 :(得分:3)
当你将i的地址传递给Allocate时,会创建另一个(临时)指针指向i的地址(即通过指针传递)。那个临时指针指向一个新位置(通过new int)。因此,i的价值就不复存在了。
答案 3 :(得分:2)
只要您输入Allocate
,就会指定p
指向新的内存块,因此它不再指向i
。然后修改新的内存块(当方法返回时会泄漏。)i
不受影响,因为在设置指向内存单元之前已经移动了指针。
答案 4 :(得分:0)
void Allocate(int **p)
{
*p = new int;
**p = 2;
}
int main()
{
int j = 10;
int *i = &j;
std::cout << i << std::endl;
Allocate(&i);
std::cout << i << std::endl;
}
输出是: 10 2
您需要一个指向指针的指针来更改指向的位置的地址。