C++ char array[] 内存泄漏

vov*_*ova -2 c++ memory

我创建了 char arr[] 并分配给它字符串文字

char arr[] = "some string";                  // arr occupies 12 chars in memory
std::cout << std::strlen(arr)  << std::endl; // lenght is 11 chars + 1 null-terminator
                                             //arr[11] is '\0'
Run Code Online (Sandbox Code Playgroud)

接下来我将空终止符放入 6 个元素

arr[5] = '\0';
std::cout << std::strlen(arr) << std::endl; // lenght is 5 chars  + 1 null-terminator
Run Code Online (Sandbox Code Playgroud)
  1. 是内存泄漏吗?
  2. 编译器如何知道它必须在第一个 '\0' 之后释放内存?(什么时候会删除变量arr)
  3. 是否可以更改此 arr 变量的长度并通知编译器在删除变量时应释放多少?

cig*_*ien 6

在这段代码中:

char arr[] = "some string";
Run Code Online (Sandbox Code Playgroud)

变量arr是一个固定大小的静态数组。这里没有动态内存分配,因此无需担心内存泄漏。无论您写入什么,编译器都会处理内存arr


use*_*751 5

  1. 是内存泄漏吗?

不。

  1. 编译器如何知道它必须在第一个 '\0' 之后释放内存?(什么时候会删除变量arr)

变量是 12 个字符。这和写一样:

char arr[12] = "some string";
Run Code Online (Sandbox Code Playgroud)

所以它总是会释放 12 个字符。该变量一个 12 个字符的数组;第 6 个字符恰好是 '\0' 的事实完全无关紧要。

顺便说一下,一旦您将第 6 个字符设置为 '\0',您仍然可以使用所有 12 个字符,因为它仍然是一个 12 个字符的数组。即使是'\0'之后的那些。但是您不能在其中存储 13 个字符。

  1. 是否可以更改此 arr 变量的长度并通知编译器在删除变量时应释放多少?

不可以。无法更改任何变量的大小。