C++返回空指针
C++ return null pointer
我下面有这段代码,我觉得有些地方我不理解d_header
是类型为WaterHeater
的指针和类house
的变量
第2行创建一个指向d_heater
对象的指针。由于两者都指向同一个对象,如果obj
或d_header
中的任何一个发生了更改,则该更改将反映在另一个对象中。第3行将nullptr
分配给d_header
,第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指针。函数返回在更改为nullptr
之前用于指向的d_header
。如果d_header
在调用函数之前曾为NULL,则它可能是NULL指针。
在这种情况下,
nullptr
是否与delete
相同?
不,不是。有两种不同的操作。将指针分配给nullptr
并不意味着在指针上调用delete
。如果需要释放指针指向的内存,则必须调用以显式调用delete
。
Q:"obj不是也指向null吗,因为两个对象都指向同一个对象"
否,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
Q"在这种情况下,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;
CCD_ 65当然仍然是7,因为尽管CCD_ 66和CCD_。
因此,d_heater
和obj
是两个不同的实体,恰好具有相同的值,对其中一个的赋值不会反映在另一个中。然而,*d_heater
和*obj
是同一个对象,如果我们分配给其中一个,它将反映在另一个中。这就是你感到困惑的地方。
为了回答您的第二个问题,nullptr
与delete
永远不一样。delete
不会更改指针的值:它释放/解构指针指向的对象。将nullptr
或NULL
分配给指针不会影响它所指向的对象:它只是将指针重新分配为不指向对象。
nullptr
未指向NULL
指针。请检查以供参考。
如果你这样做:
WaterHeater* house::removeWaterHeater(){ //Line 1
WaterHeater *obj = d_heater; //Line 2
d_heater = NULL; //Line 3
return obj; //Line 4
}
现在,obj
也指向一个NULL
而CCD_ 81并不意味着CCD_。
obj不指向null
。正如您所提到的,它只是指向一个null
指针(d_header
)。它与delete
不同,你只是让它指向了零(比如空)。
- 在 const 函数中通过引用和指针返回之间的区别
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 在函数内初始化无符号字符指针将返回空指针
- Freeimage FreeImage_ConvertTo24Bits 返回空指针
- 无法将键设置为"redisClusterCommand()"返回空指针
- opus_encoder_create() 返回一个空指针
- C++返回一个空指针数组
- C++从另一个类调用(向量)指针返回空大小
- 如何返回列表成员 c++ 的空指针
- 如何在函数C++中返回空指针
- 返回空指针的用户定义运算符new
- 在返回地址之前清空指针
- 通过引用或指针返回并检查是否为空
- 我可以在c++方法中返回空指针吗?
- Dynamic_cast返回空指针
- 返回语句返回一个空指针值而不是期望的值
- C++返回空指针
- 什么是返回非空指针的正确方法