使用c++字符串时内存泄漏

Memory leak while using c++ string

本文关键字:内存 泄漏 字符串 c++ 使用      更新时间:2023-10-16

当我在下面的程序上运行valgrind时,它报告内存泄漏。你能解释一下原因吗?

#include <string>
#include <iostream>
using namespace std;
int main()
{
    char * arr = (char *) ::operator new(sizeof(char));
    string s = arr;
    return 0;
}
  1. 行字符串s = arr到底发生了什么?它会复制arr吗?

valgrind正确。您调用new而不调用delete,因此您有内存泄漏。

arr赋给s时,后者不占有前者的所有权;相反,它会复制。释放arr仍然是你的责任。

arr的所有权不传递给s,它将arr复制到s的内部缓冲区。应该使用delete操作符

释放内存

我想你认为string将获得arr的所有权,并负责deletearr。但这是错误的。

string s = arr;

只是从arr复制字符直到到达。所以,你应该自己delete arr

代码末尾的delete arr将处理内存泄漏。

c++中的 new[] 操作符动态分配内存。所有这些内存必须由程序员手动释放。这是通过 delete[] 操作符完成的。如果不删除用new分配的内存,就会造成内存泄漏。

关于该主题的更多信息可以在c++ FAQ中找到。