繁体   English   中英

C ++返回空指针

[英]C++ return null pointer

我在下面有这段代码,我认为有些事情我不理解。
d_headerWaterHeater类型的指针,是house类的变量。
第2行创建一个指向d_heater对象的指针。 由于两者都指向同一个对象,因此,如果objd_header被更改,则更改将反映在另一个对象中。 第3行向d_header分配nullptr ,第4行返回obj 第一个问题:因为两个对象都指向同一个对象,所以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
}

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

那是不对的。 如果它们指向的内容被更改,则可以通过任一指针看到该更改,但是如果其中一个指针被更改为指向不同的内容,则另一个仍将指向先前的对象。

简单的例子:

int i = 10;
int j = 20;

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

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

  1. 直接给i赋值。

      i = 15; 
  2. 通过为ptr1指向的位置分配一个间接值。

      *ptr1 = 15; 
  3. 通过为ptr2指向的位置分配一个间接值。

      *ptr2 = 15; 

但是,您可以使用以下方法更改ptr1指向的位置:

ptr1 = &j;

现在, ptr1指向jptr2仍然指向i

i所做的任何更改都可以通过ptr2看到,但不能通过ptr1看到。
j所做的任何更改都可以通过ptr1看到,但不能通过ptr2看到。

因为两个对象都指向同一个对象,所以obj也不也指向null吗?

答案现在应该清楚了。 obj继续指向d_header所指向的对象。 它不是NULL。

那么返回Null指针有什么意义呢?

该函数不一定返回NULL指针。 该函数返回d_header所指向的所有内容,然后将其更改为nullptr 如果在调用函数之前d_header曾经为NULL,则它可能是NULL指针。

nullptr在这种情况下是否与delete相同?

不它不是。 有两种不同的操作。 将指针分配给nullptr并不自动意味着在指针上调用了delete 如果需要释放指针所指向的内存,则必须调用显式调用delete

问:“因为两个对象都指向同一个对象,所以obj也不也指向null吗?”

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

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

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

如果您希望 obj保持与d_heater相同的值, d_heater可以将其作为引用,然后objd_heater是相同的变量,它们不只是共享相同的 我们可以再次查看非指针变量,但是这次让我们将bar作为参考:

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

现在, foobar都等于42。如果要使用obj完成相同的操作,请使其成为指针引用:

WaterHeater*& obj = d_heater;

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

问:“ nullptr在这种情况下是否与delete相同?”

不,再次d_heater只是一个地址 如果将新值分配给d_heater ,则仅引用内存中的另一个点。 如果通过重新分配d_heater丢失了非常糟糕的动态分配内存的地址,则称为内存泄漏 为了防止泄漏,您必须始终释放动态分配的内存,然后再将最后一个地址丢失到动态分配的内存中(对于带有new分配的内存,请调用delete 。)

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

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

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不会影响它指向的对象:它只是重新分配了指针,使其不指向对象。

obj不是指向null 正如您提到的,它只是指向null指针( d_header )。 而且它与delete ,您只是使其指向无内容(如空)。

nullptr没有指向NULL指针。 检查以供参考。

如果您这样做:

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

现在, obj也指向NULL
而且nullptr并不意味着delete

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM