Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
内存管理 这是一个关于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 - Fatal编程技术网

内存管理 这是一个关于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++代码的内存管理问题。 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分配的内存将在函数返回后自动释放。

字符串
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=“第二”;

cout
a
在这里被自动分配到“堆栈”上,当它超出范围时将被自动销毁/解除分配

当您将动态内存与
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
a
std::string
,然后你为
b
分配了另一个地址,而没有
删除
内存。这是内存泄漏。你为
b
指定的
new
仍然在那里分配,但无法
删除它,因此它会占用内存课程的持续时间

然后,一旦你将
a
的地址分配给
b
,你就
删除b;
。这是个坏主意,可能会以一种不可预知的方式弄乱一些重要的事情。只有
删除
你用
新建
获得的内存。(这里对于
delete
ing来说,重要的不是
b
是一个指针,应该删除,而是它指向的内存不是通过
new
获得的)


内存管理的工作原理是这样的。字符串文本被分配到某个地方。您所知道的是,您不应该试图以任何方式更改它或
删除它。使用该值,不要触摸其余部分。A
std::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的指针伊特拉尔。