对于以下情况,我真的需要了解如何在C++中管理内存:
案例-1:
string s1 = "ABCD";
s1= "EFGH";,在内存中w.r.t字符串值"ABCD“中会发生什么?它会自动被释放吗?还是这里的内存泄漏?
案例2:
char* val = "ABCD";
val = "EFGH";类似于Case-1,Case-2与Case-1有何不同?
案例3:
string s1 = "ABCD";
string s2 = s1;是以"ABCD“值分配给s2的单独内存吗?还是s1和s2指向相同的内存位置?在这种情况下,如何管理内存?
请分享一个链接,以深入研究这些?任何建议都肯定对我有帮助。
发布于 2020-02-05 23:13:04
案例1
string s1 = "ABCD";string处理内存分配,以便为您存储"ABCD"。string析构函数将在s1超出作用域时自动调用,这将释放由string分配的内存。
s1 = "EFGH";string副本赋值操作符将用"EFGH"覆盖存储"ABCD"的内存。
案例2
char* val = "ABCD";
val = "EFGH";Fred在上面的注释中回答了这个问题,您只是重新分配一个指向静态字符串的指针。堆栈将只为指针(而不是数据)分配内存,并且当val超出作用域时指针将被自动释放。
案例3
string s1 = "ABCD";
string s2 = s1;s2将分配内存并复制s1。副本赋值操作符的写实现仅在s2发生变异时才会分配和复制内存。但是,在C++11中,似乎不再允许std::string的COW实现(COW的合法性::string在C++11中的实现)。
案例4
下面是一个场景的示例,您确实需要担心释放分配的内存。
如果您需要一个string来超过创建它的作用域,您可以使用它。(在实践中,您通常应该避免这种方法。参见下面的案例5。)
string* s1 = new string("ABCD");
delete s1;在本例中,string仍然在内部管理内存以存储"ABCD",但是string指针是堆分配的,当s1超出作用域时不会调用string析构函数。在这种情况下,您负责使用delete来确保在不再需要s1时清除内存。
案例5
shared_ptr<string> s1 = make_shared<string>("EFGH");shared_ptr通常是相对于new和delete的方法。由于编程错误,共享指针可以防止大量内存泄漏。shared_ptr为您处理delete,并使用引用计数来保持string活动,直到上次引用被销毁为止。
https://stackoverflow.com/questions/60084501
复制相似问题