首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当一个字符串值被赋值并随后通过分配另一个值来更改时,如何管理C++内存?

当一个字符串值被赋值并随后通过分配另一个值来更改时,如何管理C++内存?
EN

Stack Overflow用户
提问于 2020-02-05 21:39:03
回答 1查看 614关注 0票数 0

对于以下情况,我真的需要了解如何在C++中管理内存:

案例-1:

代码语言:javascript
复制
string s1 = "ABCD";
s1= "EFGH";

,在内存中w.r.t字符串值"ABCD“中会发生什么?它会自动被释放吗?还是这里的内存泄漏?

案例2:

代码语言:javascript
复制
char* val = "ABCD";
val = "EFGH";

类似于Case-1,Case-2与Case-1有何不同?

案例3:

代码语言:javascript
复制
string s1 = "ABCD";
string s2 = s1;

是以"ABCD“值分配给s2的单独内存吗?还是s1和s2指向相同的内存位置?在这种情况下,如何管理内存?

请分享一个链接,以深入研究这些?任何建议都肯定对我有帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-02-05 23:13:04

案例1

代码语言:javascript
复制
string s1 = "ABCD";

string处理内存分配,以便为您存储"ABCD"string析构函数将在s1超出作用域时自动调用,这将释放由string分配的内存。

代码语言:javascript
复制
s1 = "EFGH";

string副本赋值操作符将用"EFGH"覆盖存储"ABCD"的内存。

案例2

代码语言:javascript
复制
char* val = "ABCD";
val = "EFGH";

Fred在上面的注释中回答了这个问题,您只是重新分配一个指向静态字符串的指针。堆栈将只为指针(而不是数据)分配内存,并且当val超出作用域时指针将被自动释放。

案例3

代码语言:javascript
复制
string s1 = "ABCD";
string s2 = s1;

s2将分配内存并复制s1。副本赋值操作符的写实现仅在s2发生变异时才会分配和复制内存。但是,在C++11中,似乎不再允许std::string的COW实现(COW的合法性::string在C++11中的实现)。

案例4

下面是一个场景的示例,您确实需要担心释放分配的内存。

如果您需要一个string来超过创建它的作用域,您可以使用它。(在实践中,您通常应该避免这种方法。参见下面的案例5。)

代码语言:javascript
复制
string* s1 = new string("ABCD");
delete s1;

在本例中,string仍然在内部管理内存以存储"ABCD",但是string指针是堆分配的,当s1超出作用域时不会调用string析构函数。在这种情况下,您负责使用delete来确保在不再需要s1时清除内存。

案例5

代码语言:javascript
复制
shared_ptr<string> s1 = make_shared<string>("EFGH");

shared_ptr通常是相对于newdelete的方法。由于编程错误,共享指针可以防止大量内存泄漏。shared_ptr为您处理delete,并使用引用计数来保持string活动,直到上次引用被销毁为止。

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

https://stackoverflow.com/questions/60084501

复制
相关文章

相似问题

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