C ++返回空指针

时间:2015-07-04 03:50:49

标签: c++ pointers

我在下面有这个代码,我认为有些内容我不明白。
d_headerWaterHeater类型的指针和类{house的变量1}}。
第2行创建一个指向d_heater对象的指针。由于两者都指向同一个对象,因此如果更改objd_header,则更改将反映在另一个中。第3行将nullptr分配给d_header,第4行返回obj。第一个问题:Isn' t obj也指向null,因为两个对象都指向同一个对象?那么返回Null指针的交易是什么?第二个问题:在这种情况下,nullptrdelete是否相同?
谢谢你的时间。

WaterHeater* house::removeWaterHeater(){ //Line 1
    WaterHeater *obj = d_heater;         //Line 2
    d_heater = nullptr;                  //Line 3
    return obj;                          //Line 4
}

5 个答案:

答案 0 :(得分:3)

  

由于两者都指向同一个对象,如果更改了objd_header,则更改将反映在另一个中。

这是不正确的。如果它们指向的内容发生了变化,则可以通过任一指针看到该变化,但如果其中一个被更改以使其指向不同的东西,则另一个仍将指向前一个对象。

简单示例:

int i = 10;
int j = 20;

int* ptr1 = &i;
int* ptr2 = ptr1;

此时,两个指针都指向同一个对象ii的值可以通过以下方式更改:

  1. 直接为i分配值。

     i = 15;
    
  2. 间接地为ptr1指向的地方指定一个值。

     *ptr1 = 15;
    
  3. 间接地为ptr2指向的地方指定一个值。

     *ptr2 = 15;
    
  4. 但是,您可以使用以下内容更改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指针。

      在这种情况下,

    nullptrdelete相同吗?

    不,不是。有两种不同的操作。分配指向nullptr的指针不会自动意味着在指针上调用delete。如果您需要释放指针指向的内存,则必须明确调用delete

答案 1 :(得分:2)

问:" Isn< obj也指向null,因为两个对象都指向同一个对象?"

不,objd_heater都包含内存中的地址。改变一个不会改变另一个。如果你考虑非指针变量,这很容易看出:

int foo = 13;
int bar = foo;
foo = 42;

显然,我们知道bar仍然保留13,同样obj仍保留原始地址。

如果希望 obj保持与d_heater相同的值,您可以将其作为参考,那么objd_heater就是相同的变量他们不会简单地共享相同的。我们可以再次看到非指针变量,但这一次让我们bar作为参考:

int foo = 13;
int& bar = foo;
foo = 42;

现在foobar都等于42.如果您想使用obj完成同样的事情,请将其作为指针引用:

WaterHeater*& obj = d_heater;

您可以在此处查看更详细的示例:http://ideone.com/I8CTba

Q值。 "在这种情况下,nullptr是否与delete相同?"

不,再次d_heater只是地址。如果为d_heater分配新值,则只是引用内存中的不同点。如果重新分配d_heater,则会丢失动态分配的内存非常糟糕的地址,它被称为memory leak。为防止泄漏,必须始终释放动态分配的内存,然后将最后一个地址丢失到动态分配的内存中(对delete分配的内存调用new。)

也就是说,动态内存分配的使用最好留给标准库,除非你真的知道自己在做什么。因此,我强烈建议您使用auto-pointers。在C ++ 11中,这些是unique_ptrshared_ptr

答案 2 :(得分:1)

你混淆了两个指针指向同一个对象和两个指针指向同一个对象的想法。当你写:

WaterHeater *obj = d_heater;
d_heater = nullptr;

您将d_heater的值分配给obj,但它们仍然是单独的变量。这就像写作:

int x = 7;
int y = x;
x = 8;

y当然仍然是7,因为虽然xy具有相同的值,但它们不是同一个对象。

因此,d_heaterobj是两个不同的实体,它们碰巧具有相同的值,而对一个的分配不会反映在另一个中。但是,*d_heater*obj 是同一个对象,如果我们分配给其中一个,它将反映在另一个中。这是你感到困惑的地方。

要回答第二个问题,nullptr永远不会与delete相同。 delete不会更改指针的值:它会销毁指针指向的对象。将nullptrNULL分配给指针不会影响它指向的对象:它只是重新指定指针而不指向对象。

答案 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