首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存管理

内存管理
EN

Stack Overflow用户
提问于 2010-07-31 00:25:22
回答 6查看 361关注 0票数 2

这是一个关于c++代码的内存管理问题。

代码语言:javascript
复制
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;
}

我们可以释放存储b所指向的字符串的内存块。我假设这意味着一旦完成,b就不再有任何意义。我们可以释放b来释放一些内存。为什么我们不能解除分配?我知道我们只能删除/释放指针,但是字符串a必须在某个地方占用一些内存。有什么方法可以释放字符串a占用的内存吗?如果有足够的字符串以与初始化a相同的方式初始化,是否有可能内存耗尽?

EN

回答 6

Stack Overflow用户

发布于 2010-07-31 00:29:29

字符串a在堆栈上声明。您不能手动释放它,但一旦它离开作用域(例如,当封闭函数返回时),它将自动释放。如果您需要能够在函数中间释放内存,那么可以动态声明它(就像您对b所做的那样)。

票数 4
EN

Stack Overflow用户

发布于 2010-07-31 00:52:59

该字符串由一个小对象组成,该对象包含指向字符串数据存储的指针,该数据的生存期由该对象管理。通常不需要担心对象本身占用的内存,但是如果字符串很大,那么您可能希望在不破坏对象的情况下释放存储。

调用clear()或从空字符串赋值可能不会释放存储空间。确保它被释放的方法是用新构造的临时对象交换字符串;临时对象的析构函数将释放它。

代码语言:javascript
复制
string().swap(a); // replaces `a` with an empty string

您也可以对任何标准容器执行此操作。

票数 3
EN

Stack Overflow用户

发布于 2010-07-31 01:31:38

这太尴尬了。

<string.h>是一个C标头。它没有定义string。看起来您的<iostream>版本直接或间接地包含了<string>,否则会出现错误。

文字字符串(由成对引号分隔的字符串)几乎可以在任何地方,包括只读内存段。(它们确实占用内存,但你必须有大量的文本才能产生重大影响:像“战争与和平”这样的东西不会占用完整的内存。)在这种情况下,使用该值初始化std::string,然后为其分配另一个值。std::string处理它所使用的内存。

在C++中,几乎没有理由让指针指向std::string。在没有内容的情况下,std::string不会占用太多空间,并且它自己管理内容的内存。你把这和char *搞混了吗

您可以为b new一个std::string,然后在不占用内存的情况下为b分配另一个地址。这是一个内存泄漏。你为b new的东西仍然分配在那里,但是没有办法delete它,所以它将在程序的持续时间内占用内存。

然后,一旦您将a的地址分配给b,您就可以delete b;。这是一个糟糕的想法,可能会以一种不可预测的方式搞砸一些重要的事情。只有你用new获得的delete内存。(对于deleteing来说,重要的不是b是一个指针,应该删除,而是它指向的内存不是通过new获得的。)

内存管理的工作原理是这样的。字符串文字被分配到某个地方。你所知道的就是你不应该以任何方式去改变它或者delete它。使用该值,不要触动其余部分。std::string为自己的内容管理内存,并将在其析构函数中处理这些内容。在函数或其他块中声明的变量一旦超出作用域,就会被销毁(尽管它可能指向的任何东西都不会自动销毁;只有当它是智能指针或管理自己的内存时才会销毁)。如果你有内存,不要丢弃指针值,直到它是deleted。如果你没有new的内存,不要delete它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3373443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档