我正在阅读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'会发生什么?内存分配没有删除,是不是应该导致问题?
答案 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}的纸条上记录了这个房子。 }。 ...