这是一个关于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;
}我们可以释放存储b所指向的字符串的内存块。我假设这意味着一旦完成,b就不再有任何意义。我们可以释放b来释放一些内存。为什么我们不能解除分配?我知道我们只能删除/释放指针,但是字符串a必须在某个地方占用一些内存。有什么方法可以释放字符串a占用的内存吗?如果有足够的字符串以与初始化a相同的方式初始化,是否有可能内存耗尽?
发布于 2010-07-31 00:29:29
字符串a在堆栈上声明。您不能手动释放它,但一旦它离开作用域(例如,当封闭函数返回时),它将自动释放。如果您需要能够在函数中间释放内存,那么可以动态声明它(就像您对b所做的那样)。
发布于 2010-07-31 00:52:59
该字符串由一个小对象组成,该对象包含指向字符串数据存储的指针,该数据的生存期由该对象管理。通常不需要担心对象本身占用的内存,但是如果字符串很大,那么您可能希望在不破坏对象的情况下释放存储。
调用clear()或从空字符串赋值可能不会释放存储空间。确保它被释放的方法是用新构造的临时对象交换字符串;临时对象的析构函数将释放它。
string().swap(a); // replaces `a` with an empty string您也可以对任何标准容器执行此操作。
发布于 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它。
https://stackoverflow.com/questions/3373443
复制相似问题