这很尴尬。
<string.h>
是C标头。它没有定义string
。它看起来像你的版本<iostream>
直接或间接包括<string>
,否则会出现错误。
字符串(由成对引号分隔的那些东西)可能在任何地方,包括只读内存段。 (他们确实占用了内存,但是你必须有很多文本才能产生重大影响:类似战争与和平不会占用完整的大小。)在这种情况下,std::string
是用该值进行初始化,然后再赋值给它。 std::string
处理它使用的内存。
在C++中,几乎没有理由指向std::string
。 std::string
没有内容就占用太多空间,并且管理内容本身的内存。你是否与char *
混淆?
您new
一个为b
std::string
,然后再指定地址b
没有delete
荷兰国际集团的内存。这是内存泄漏。你为b
编new
仍然分配在那里,但它没有办法delete
它,所以它会占用内存的程序期间。
然后,一旦您将a
的地址分配给b
,您delete b;
。这是一个糟糕的想法,并可能以一种可能无法预测的方式搞砸重要事情。只有您用new
获得的delete
内存。 (这里delete
ing的重要不是b
是一个指针,应该删除,但它指向的内存不是通过new
得到的。)
内存管理的工作原理与此类似。字符串文字被分配到某处。所有你知道的是,你不应该试图改变它或以任何方式它delete
它。使用该值,不要碰其余的。 A std::string
为其内容管理内存,并在其析构函数中处理该内存。一个在函数或其他块中声明的变量一旦超出范围就会被销毁(尽管它可能指向的内容不会被自动销毁;只有当它是一个智能指针或管理自己的内存或其他内容时)。如果你的内存是new
,请不要丢弃指针值,直到它为delete
d。如果您还没有new
ed内存,请不要delete
它。
+1你的答案比我的更完整。 – karlphillip 2010-07-30 16:33:05
或者您可以将字符串放在较小的范围内......并不是在大多数情况下都是值得的。 – 2010-07-30 17:08:06