new char与delete[]问题,疑惑点终得解开:为什么释放指向的内存空间后,其中的数据还可以继续访问

请问:将一个保存有字符串变量的指针等号赋值给另一个char*类型的变量,这个过程发生了什么?
解答:将一个保存有字符串变量的指针等号赋值给另一个 char* 类型的变量,实际上是将指针的值(即指向字符串的内存地址)复制给了另一个指针变量。这个过程并不会复制字符串本身,只是复制了指向字符串的内存地址。
来看下C++代码示例:

#include <iostream>
#include <cstring>

int main() {
    char* str1 = new char[10]; // 动态分配一个长度为 10 的字符数组
    std::strcpy(str1, "hello"); // 将字符串 "hello" 复制到 str1 指向的内存中
    char* str2 = str1; // 将 str1 的值(即指向字符串 "hello" 的内存地址)赋值给 str2
    std::cout << "str1: " << str1 << std::endl; // 输出 "str1: hello"
    std::cout << "str2: " << str2 << std::endl; // 输出 "str2: hello"
    delete[] str1; // 释放 str1 指向的内存
    return 0;
}

在上面的示例代码中,我们进行了如下操作:

  1. 使用 new 运算符动态分配了一个长度为 10 的字符数组
  2. 将字符串 “hello” 复制到该数组中
  3. 将指向该数组的指针 str1 赋值给了另一个指针变量 str2
  4. 输出了 str1str2 指向的字符串
  5. 释放了 str1 指向的内存

需要注意的是,当我们释放 str1 指向的内存时,str2 指向的内存并没有被释放,因为它们指向的是同一块内存。如果我们在释放 str1 后继续使用 str2,就会导致未定义的行为。因此,在释放 str1 后,我们应该将 str2 赋值为 nullptr,以避免出现问题

那么注意中这句话不理解:

当我们释放 str1 指向的内存时,str2 指向的内存并没有被释放,因为它们指向的是同一块内存

进一步解释:
当我们创建一个字符串变量 str1 并将其赋值为 "hello" 时,计算机会在内存中分配一块空间来存储这个字符串。然后,当我们创建另一个字符串变量 str2 并将其赋值为 str1 时,计算机不会再次分配一块新的内存空间来存储 "hello",而是将 str2 指向 str1 指向的内存空间。
因此,当我们释放 str1 指向的内存空间时,实际上是释放了存储 "hello" 的那块内存空间。但是,由于 str2 指向的是同一块内存空间,所以 str2 指向的内存空间并没有被释放。这就是为什么在释放 str1 后,str2 仍然可以访问 "hello" 的原因。

还是不太明白

str2str1指向的是同一块内存空间,那么当释放 str1 指向的内存空间后,str2指向的内存空间应该也被释放了啊?为什么str2 仍然可以访问 `"hello"呢?

原来是这样:

这是因为在释放 str1 指向的内存空间时,实际上只是释放了这块内存空间的标记,告诉计算机这块内存空间可以被重新使用了。但是,这块内存空间的内容并没有被立即清除,因此 str2 仍然可以访问 "hello"

当我们释放内存时,操作系统会将这块内存标记为可用,但是并不会立即清除内存中的数据。这是因为清除内存需要花费时间和计算资源,而操作系统希望尽可能地提高内存的使用效率。

因此,当我们释放 str1 指向的内存空间时,str2 指向的内存空间中的数据仍然存在,直到这块内存被重新分配给其他变量或者程序结束时才会被清除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 1 0 在C语言中,我们可以使用`json_object_new_string`函数将一个C风格的字符串转换为JSON字符串对象。如果要将std::vector中的char数据转换为JSON格式数据,需要先将其转换为C风格的2 0 4 0 0 0 0 0 0 0 字符串,然后再使用`json_object_new_string`函数将其转换为JSON格式数据。以下是一个示例代码: 0 0 0 0 0 0 0 0 0 0 ```c++ #include <vector> #include <iostream> #include <json-c/json.h> int main() { std::vector<char> v 5 2 0 2 0 0 0 3 0 0 = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l 0 0 0 0 0 0 0 0 0 ', 'd'}; // 将char数据转换为C风格的字符串 char* str = new char[v.size()0 0 0 0 0 0 0 4 0 0 + 1]; for (int i = 0; i < v.size(); i++) { str[i] = v[i]; 0 1 2 3 0 0 0 0 0 0 } str[v.size()] = '\0'; // 创建JSON格式数据 json_object *j = json_object_new_string(str); // 输出JSON格式数据 std::cout << json_object_to_json_string(j) << std::endl; // 释 0 0 0 0 0 0 0 0 0 0 放资源 delete[] str; json_object_put(j); return 0; } ``` 在上述代码中,我们 0 0 4 1 0 0 0 0 1 0首先使用循环将std::vector中的char数据转换为C风格的字符串。注意,我们需要在字符串的 0 0 0 0 0 0 0 0 0 结尾添加一个'\0'字符以表示字符串的结束。然后,我们使用`json_object_new_string`函数将该字符串0 0 0 0 0 0 0 0 2 0 0 1 0 0 0 0 0 0 0 0 转换为JSON字符串对象。最后,我们使用`json_object_to_json_string`函数将j字符串对象转换为字符串,并将其输出到控制台。注意,我们需要在程序结束前释放str和j的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值