繁体   English   中英

函数中的内存重新分配(C ++)

[英]Memory deallocation in a function (C++)

我正在阅读C ++ Primer书中的以下代码:

#include <iostream>
#include <cstring> // or string.h

using namespace std;

char * getname(void); // function prototype

int main()
{
  char * name; // create pointer but no storage
  name = getname(); // assign address of string to name
  cout << name << “ at “ << (int *) name << “\n”;
  delete [] name; // memory freed
  name = getname(); // reuse freed memory
  cout << name << “ at “ << (int *) name << “\n”;
  delete [] name; // memory freed again
  return 0;
}

char * getname() // return pointer to new string
{
  char temp[80]; // temporary storage
  cout << “Enter last name: “;
  cin >> temp;
  char * pn = new char[strlen(temp) + 1];
  strcpy(pn, temp); // copy string into smaller space
  return pn; // temp lost when function ends
}

函数“ getname”返回后,指针“ pn”会发生什么? 内存分配未删除,不是应该引起问题吗?

您正在返回一个指向内存块的指针。 该内存块是随new分配的。 就像任何其他自动变量一样,'pn'本身也被销毁,但是其持有的地址是从getname返回的。 分配的内存仍然存在,直到在主函数中调用delete为止。 由于在分配的内存上调用了delete,因此不会发生内存泄漏。 您不会丢失指针,因为它是从getname返回然后在main中分配的。

函数“ getname”返回后,指针“ pn”会发生什么?

指针值(基本上是一个内存地址)可以简单地复制到调用站点,例如:

 char * name; // create pointer but no storage name = getname() 

getname()返回的pn值(即内存地址getname()被复制到name

内存分配未删除,不是应该引起问题吗?

实际上,我在您发布的代码中读取了一些delete[]行。 因此在我看来,内存实际上已释放。

当然,这段代码很奇怪:也许是出于某种学习目的? 是要教什么吗?

在现代C ++生产代码中,您应该只使用方便的RAII字符串类(例如std::string来存储和管理您的字符串。

让我尝试用这种方式解释它。 您有纸质便笺(缩写pn)。 您要求承包商在Memory Lane上为您盖房子。 承包商建造它( new char[...] ),并告诉您:“哦,它在4711号。” 您在票据pn上正确记录了该票据。 当您的妻子(主要人物)打电话给您时,所有这一切都发生了,现在您告诉她,“这是在4711号的记忆巷”,然后您将纸丢掉并决定回家。 同时,您的妻子看了看房子,认为自己不喜欢它,并指示另一个承包商销毁那座房子( delete[] name ),她在一张纸条上记录的号码叫做name ...

暂无
暂无

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

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