C++ 教科书上的指针例子让我困惑

C++ 教科书上的指针例子让我困惑,c++,pointers,C++,Pointers,我现在正在课堂上复习一些要点,我们的课本让我有点困惑。他们首先说,以下示例将money指向的位置的值复制到myMoney指向的位置: *myMoney = *money; 然后,下一个示例将货币价值复制到myMoney中 myMoney = money; 第二个示例导致内存泄漏,因为*myMoney指向的原始位置不再可访问。这是因为用来保存指针的内存现在是实际的浮点值而不是内存地址吗 现在让我有点困惑的部分是在下一部分,当他们展示一个不同的声明时。完整示例: char alpha[20];

我现在正在课堂上复习一些要点,我们的课本让我有点困惑。他们首先说,以下示例将money指向的位置的值复制到myMoney指向的位置:

*myMoney = *money;
然后,下一个示例将货币价值复制到myMoney中

myMoney = money;
第二个示例导致内存泄漏,因为*myMoney指向的原始位置不再可访问。这是因为用来保存指针的内存现在是实际的浮点值而不是内存地址吗

现在让我有点困惑的部分是在下一部分,当他们展示一个不同的声明时。完整示例:

char alpha[20];
char *alphaPtr;
char *letterPtr;
vod Process(char []);
.
.
alphaPtr = alpha;
letterPtr = &alpha[0];
Process(alpha);
因为书上说

myMoney = money;
将创建内存泄漏,因为它切断指针和指向地址的指针之间的链接

alphaPtr = alpha;
导致内存链接也?他们不应该这样宣布吗

char *alphaPtr = *alpha;
第二个示例导致内存泄漏,因为*myMoney指向的原始位置不再可访问。这是因为用来保存指针的内存现在是实际的浮点值而不是内存地址吗

存储在myMoney中的内存位置现在丢失。如果它已分配,则无法恢复其地址以解除分配


在第二个示例中,数组的特殊之处在于,按名称引用它们就是引用它们的地址

分配指针的问题

myMoney = money;
只是如果
myMoney
是指向该值的唯一指针,则您将无法再访问它。

需要记住的事项:

  • myMoney
    money
    是指针,所以
    myMoney=money将一个指针复制到另一个指针上。现在,您有两个指针指向同一个对象(指向
    money
    的对象),而没有任何指针指向
    myMoney
    过去指向的对象(这是内存泄漏)
  • *myMoney
    *money
    是指针指向的值(因为
    *
    取消对指针的引用以获取指针指向的内容),所以
    *myMoney=*money
    货币
    指向的内容复制到
    我的货币
    指向的内容上;指针本身没有改变
  • alpha
    是一个数组,可以将其降级为指向数组中第一个元素的指针
  • alphaPtr没有泄漏,因为它一开始没有指向任何东西
  • 是,
    char*alphaPtr=*alpha
    本来是一种更好的编写方式,因为这样
    alphaPtr
    就不会花费任何时间进行未初始化。有些编译器甚至会在您声明未初始化的指针(如教科书示例)时发出警告
  • 使用(取消引用)未初始化的指针是一件坏事,因为它会导致可怕的未定义行为。您的程序可能会立即崩溃,也可能会在很久以后崩溃,或者它可能只是在不告诉您任何信息的情况下损坏您的数据,而您只会在几个月后(如果有的话)找到它

myMoney=money
如果
myMoney
之前指向动态分配的内存,则会泄漏
myMoney
被分配了一个新的指向的内存地址,因此,如果没有其他引用它,它最初指向的内存将泄漏,以便以后可以释放

alphaPtr=alpha
不是泄漏
alpha
是实际内存,
alphaPtr
只是指向它。即使将
alphaPtr
指定给指向其他对象,
alpha
也存在于堆栈上,并且在超出范围时将自动回收


char*alphaPtr=*alpha
将不会编译。您试图将
char
分配给
char*
,这是无效的。

因此,如果我在声明过程中没有指针指向任何对象,那么当我以后实际分配某个对象时,我不会丢失任何对象?对,但如果您没有值来分配它,则可能不应该声明指针。当指向对象的最后一个指针丢失时,就会发生泄漏。那么,如果发生这样的内存泄漏,垃圾收集器会回收该内存供以后使用,还是只是在程序终止前占用空间?如果有垃圾收集器(不是C++标准),它会收集未使用的对象。从技术上讲,它不再是一个漏洞。否则,该内存将在程序运行时的其余部分不使用。如果你泄漏了大量内存,你可能最终耗尽可用空间……C++没有垃圾收集器,除非你自己去写或链接,这是很少的情况。抱歉,只是修复了“链接”部分。谢谢。我不知道为什么当我第一次在教科书上看到它的时候,我没有理解它。出于某种原因,我认为当它第一次被声明时,它保留了一个内存槽,然后当我们后来分配给它一些东西时,它与那个内存槽断开链接并创建了另一个,但这是一个可怕的错误想法。指针是编程中比较难的主题之一。它需要从代数的“变量持有一个值”思维中跳出来,因为如果它是指针,那么变量现在只持有一个值的地址,而这个地址没有(本科)数学上的平行关系(至少在计算机科学之外)。好的,我想*alpha会把它的地址分配给*alphaPtr。分配给指针的内容与是否泄漏内存无关。关键是:指针以前的值是否指向其他地方未跟踪的内存?换句话说,指针的新值不会导致泄漏,而是旧值。由于旧值在
alphaPtr
的情况下无效,因此没有泄漏。我只想感谢所有你们提供的帮助!