内存管理 这是一个关于C++代码的内存管理问题。 using namespace std; #include <iostream> #include <string.h> int main() { string a="first"; string *b= new string; *b=a; a="second"; cout << *b << ", " << a; delete b; return 0; } 使用名称空间std; #包括 #包括 int main() { 字符串a=“第一”; 字符串*b=新字符串; *b=a; a=“第二”; cout
为a分配的内存将在函数返回后自动释放。字符串内存管理 这是一个关于C++代码的内存管理问题。 using namespace std; #include <iostream> #include <string.h> int main() { string a="first"; string *b= new string; *b=a; a="second"; cout << *b << ", " << a; delete b; return 0; } 使用名称空间std; #包括 #包括 int main() { 字符串a=“第一”; 字符串*b=新字符串; *b=a; a=“第二”; cout,c++,memory-leaks,memory-management,C++,Memory Leaks,Memory Management,为a分配的内存将在函数返回后自动释放。字符串a在堆栈上声明。您不能手动释放它,但一旦它离开作用域,它将自动释放(例如,当封闭函数返回时)。如果您需要能够释放该内存mid函数,请动态声明它(就像您对b所做的那样)。自动对象(如您的a)在超出作用域时会被销毁。请参见下面的示例: int main() { { string a="first"; string *b= new string; *b=a; a="second"; cout <&l
a
在堆栈上声明。您不能手动释放它,但一旦它离开作用域,它将自动释放(例如,当封闭函数返回时)。如果您需要能够释放该内存mid函数,请动态声明它(就像您对b
所做的那样)。自动对象(如您的a)在超出作用域时会被销毁。请参见下面的示例:
int main()
{
{
string a="first";
string *b= new string;
*b=a;
a="second";
cout << *b << ", " << a;
delete b; //b gets freed
} //a gets freed because it has gone out of scope
/* You can write more code here that does not need a */
return 0;
intmain()
{
{
字符串a=“第一”;
字符串*b=新字符串;
*b=a;
a=“第二”;
couta
在这里被自动分配到“堆栈”上,当它超出范围时将被自动销毁/解除分配
当您将动态内存与new
/malloc
一起使用时,它会被分配到“堆”中,而“堆”只是程序可用的一堆内存。您必须手动管理此内存,而程序不知道何时将其清除
如果在这种情况下您真的担心内存,那么您应该使用动态内存分配
编辑:这给出了比我想说的更完整的解释:
字符串由一个小对象组成,其中包含一个指向字符串数据存储的指针,其生存期由该对象管理。通常不需要担心对象本身占用的内存,但如果字符串较大,则可能希望在不破坏对象的情况下释放存储
调用clear()
,或从空字符串赋值,可能无法释放存储。确保释放存储的方法是将该字符串与新构造的临时字符串交换;临时字符串的析构函数将释放它
string().swap(a); // replaces `a` with an empty string
您也可以对任何标准容器执行此操作。这相当尴尬
是一个C头。它没有定义字符串
。它看起来像是您的
版本直接或间接包含了
,否则会出错
文字字符串(那些由成对引号分隔的东西)几乎可以在任何地方,包括只读内存段。(它们确实占用内存,但你必须有大量的文本才能产生重大影响:像战争与和平这样的东西不会占用整个meg。)在这种情况下,std::string
将使用该值初始化,随后将为其分配另一个值。std::string
处理其使用的内存
< C++ >中,几乎没有理由指向一个<代码> STD::String 。 STD::String 没有占用其内容的空间,它管理内容本身的内存。你把这个与<代码> char *<代码>混淆了吗?
你为b
指定了new
astd::string
,然后你为b
分配了另一个地址,而没有删除
内存。这是内存泄漏。你为b
指定的new
仍然在那里分配,但无法删除它,因此它会占用内存课程的持续时间
然后,一旦你将a
的地址分配给b
,你就删除b;
。这是个坏主意,可能会以一种不可预知的方式弄乱一些重要的事情。只有删除你用新建
获得的内存。(这里对于delete
ing来说,重要的不是b
是一个指针,应该删除,而是它指向的内存不是通过new
获得的)
内存管理的工作原理是这样的。字符串文本被分配到某个地方。您所知道的是,您不应该试图以任何方式更改它或删除它。使用该值,不要触摸其余部分。Astd::string
为其自身内容管理内存,并将在其析构函数中处理该内容。A var在函数或其他块中声明的iable一旦超出范围就会被销毁(尽管它可能指向的任何内容都不会自动销毁;只有当它是智能指针或管理自己的内存或其他内容时)如果你new
memory,在它delete
d之前不要扔掉指针值。如果你没有new
ed memory,不要delete
它。或者你可以把字符串放在一个更小的范围内…这在大多数情况下都不值得。嗯,实际上那里没有内存泄漏:作者写了string*b=new string;*b=a;
如果他写了:`string*b=new string;b=&a;`同意您的其他语句,那么就会发生内存泄漏。+1用于提及字符串文字内存位置。它们通常位于应用程序的静态内存中,而不是堆栈或堆中。这就是为什么您永远不应该删除指向字符串l的指针伊特拉尔。