[英]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.