[英]C++ return null pointer
我在下面有这段代码,我认为有些事情我不理解。
d_header
是WaterHeater
类型的指针,是house
类的变量。
第2行创建一个指向d_heater
对象的指针。 由于两者都指向同一个对象,因此,如果obj
或d_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
}
由于两者都指向同一个对象,因此,如果
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
看到。
因为两个对象都指向同一个对象,所以
obj
也不也指向null吗?
答案现在应该清楚了。 obj
继续指向d_header
所指向的对象。 它不是NULL。
那么返回Null指针有什么意义呢?
该函数不一定返回NULL指针。 该函数返回d_header
所指向的所有内容,然后将其更改为nullptr
。 如果在调用函数之前d_header
曾经为NULL,则它可能是NULL指针。
nullptr
在这种情况下是否与delete
相同?
不它不是。 有两种不同的操作。 将指针分配给nullptr
并不自动意味着在指针上调用了delete
。 如果需要释放指针所指向的内存,则必须调用显式调用delete
。
不, obj
和d_heater
都包含内存中的地址。 更改一个不会更改另一个。 如果您考虑非指针变量,这很容易看出:
int foo = 13;
int bar = foo;
foo = 42;
显然,我们知道bar
仍然保留13
,而obj
仍然保留原始地址。
如果您希望 obj
保持与d_heater
相同的值, 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
丢失了非常糟糕的动态分配内存的地址,则称为内存泄漏 。 为了防止泄漏,您必须始终释放动态分配的内存,然后再将最后一个地址丢失到动态分配的内存中(对于带有new
分配的内存,请调用delete
。)
也就是说,除非您真的知道自己在做什么,否则最好将动态内存分配的使用留给标准库。 因此,我强烈建议您考虑使用自动指针 。 在C ++ 11中,这些是unique_ptr
和shared_ptr
。
你混淆两个指针指向同一个对象和两个指针是同一对象的思想。 当你写:
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
不会影响它指向的对象:它只是重新分配了指针,使其不指向对象。
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.