我在下面有这个代码,我认为有些内容我不明白。
d_header
是WaterHeater
类型的指针和类{house
的变量1}}。
第2行创建一个指向d_heater
对象的指针。由于两者都指向同一个对象,因此如果更改obj
或d_header
,则更改将反映在另一个中。第3行将nullptr
分配给d_header
,第4行返回obj
。第一个问题:Isn' t obj
也指向null,因为两个对象都指向同一个对象?那么返回Null指针的交易是什么?第二个问题:在这种情况下,nullptr
与delete
是否相同?
谢谢你的时间。
WaterHeater* house::removeWaterHeater(){ //Line 1
WaterHeater *obj = d_heater; //Line 2
d_heater = nullptr; //Line 3
return obj; //Line 4
}
答案 0 :(得分:3)
由于两者都指向同一个对象,如果更改了
obj
或d_header
,则更改将反映在另一个中。
这是不正确的。如果它们指向的内容发生了变化,则可以通过任一指针看到该变化,但如果其中一个被更改以使其指向不同的东西,则另一个仍将指向前一个对象。
简单示例:
int i = 10;
int j = 20;
int* ptr1 = &i;
int* ptr2 = ptr1;
此时,两个指针都指向同一个对象i
。 i
的值可以通过以下方式更改:
直接为i
分配值。
i = 15;
间接地为ptr1
指向的地方指定一个值。
*ptr1 = 15;
间接地为ptr2
指向的地方指定一个值。
*ptr2 = 15;
但是,您可以使用以下内容更改ptr1
指向的位置:
ptr1 = &j;
现在,ptr1
指向j
,但ptr2
仍然指向i
。
对i
所做的任何更改都将通过ptr2
显示,但不会显示ptr1
。
对j
所做的任何更改都将通过ptr1
显示,但不会显示ptr2
。
Isn' t
obj
也指向null,因为两个对象都指向同一个对象?
答案现在应该清楚了。 obj
继续指出d_header
曾经指出的内容。它不是NULL。
那么返回Null指针的交易是什么?
该函数不一定返回NULL指针。该函数返回在更改为d_header
之前用于指向的nullptr
。如果d_header
在调用函数之前曾经是NULL,那么它可能是一个NULL指针。
在这种情况下,
nullptr
与delete
相同吗?
不,不是。有两种不同的操作。分配指向nullptr
的指针不会自动意味着在指针上调用delete
。如果您需要释放指针指向的内存,则必须明确调用delete
。
答案 1 :(得分:2)
不,obj
和d_heater
都包含内存中的地址。改变一个不会改变另一个。如果你考虑非指针变量,这很容易看出:
int foo = 13;
int bar = foo;
foo = 42;
显然,我们知道bar
仍然保留13
,同样obj
仍保留原始地址。
如果希望 obj
保持与d_heater
相同的值,您可以将其作为参考,那么obj
和d_heater
就是相同的变量他们不会简单地共享相同的值。我们可以再次看到非指针变量,但这一次让我们bar
作为参考:
int foo = 13;
int& bar = foo;
foo = 42;
现在foo
和bar
都等于42.如果您想使用obj
完成同样的事情,请将其作为指针引用:
WaterHeater*& obj = d_heater;
您可以在此处查看更详细的示例:http://ideone.com/I8CTba
nullptr
是否与delete
相同?" 不,再次d_heater
只是地址。如果为d_heater
分配新值,则只是引用内存中的不同点。如果重新分配d_heater
,则会丢失动态分配的内存非常糟糕的地址,它被称为memory leak。为防止泄漏,必须始终释放动态分配的内存,然后将最后一个地址丢失到动态分配的内存中(对delete
分配的内存调用new
。)
也就是说,动态内存分配的使用最好留给标准库,除非你真的知道自己在做什么。因此,我强烈建议您使用auto-pointers。在C ++ 11中,这些是unique_ptr
和shared_ptr
。
答案 2 :(得分:1)
你混淆了两个指针指向同一个对象和两个指针指向同一个对象的想法。当你写:
WaterHeater *obj = d_heater;
d_heater = nullptr;
您将d_heater
的值分配给obj,但它们仍然是单独的变量。这就像写作:
int x = 7;
int y = x;
x = 8;
y
当然仍然是7,因为虽然x
和y
具有相同的值,但它们不是同一个对象。
因此,d_heater
和obj
是两个不同的实体,它们碰巧具有相同的值,而对一个的分配不会反映在另一个中。但是,*d_heater
和*obj
是同一个对象,如果我们分配给其中一个,它将反映在另一个中。这是你感到困惑的地方。
要回答第二个问题,nullptr
永远不会与delete
相同。 delete
不会更改指针的值:它会销毁指针指向的对象。将nullptr
或NULL
分配给指针不会影响它指向的对象:它只是重新指定指针而不指向对象。
答案 3 :(得分:0)
obj并未指向null
。正如你所提到的,它只是指向null
指针(d_header
)。
它与delete
没有相同之处,你只是把它指向任何东西(比如空的)。
答案 4 :(得分:0)
NULL
未指向WaterHeater* house::removeWaterHeater(){ //Line 1
WaterHeater *obj = d_heater; //Line 2
d_heater = NULL; //Line 3
return obj; //Line 4
}
指针。查看this以获取参考。
如果你这样做:
obj
现在,NULL
也指向nullptr
delete
并不代表params
=> {photo: {item_id: 1, **other_attrs}}
params[:item_id]
=> nil
params[:photo][:item_id]
=> 1
。