函数中的内存释放(C ++)

时间:2014-04-15 17:09:26

标签: c++ function pointers

我正在阅读C ++入门手册中的以下代码:

#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'会发生什么?内存分配没有删除,是不是应该导致问题?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

指针&#39; pn&#39;会发生什么?返回功能&#39; getname&#39; ?

指针值(基本上是一个存储器地址)只是在呼叫站点复制,例如:

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

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

  

内存分配不会被删除,是不是应该导致问题?

实际上,我在您发布的代码中读了一些delete[]行。所以在我看来,记忆实际上已经释放了。

当然,这段代码很奇怪:也许是出于学习目的?是否意味着要教一些东西?

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

答案 2 :(得分:0)

让我试着用这种方式解释一下。你有纸质便条(缩写为pn)。你要求承包商在Memory Lane建一座房子。承包商建造它(new char[...]')并告诉你,“哦,它是在4711号。”您在pn的单据上注明了这一点。所有这一切都发生了,而你的妻子(主要人物)已经打电话给你,现在你告诉她,“它在记忆巷里,没有4711号”,然后你把纸扔掉,决定回家。与此同时,你的妻子看着房子,决定她不喜欢它,并指示另一个承包商摧毁那所房子(delete[] name),她在一张名为{{1}的纸条上记录了这个房子。 }。 ...