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

这篇具有很好参考价值的文章主要介绍了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 指向的内存空间中的数据仍然存在,直到这块内存被重新分配给其他变量或者程序结束时才会被清除。文章来源地址https://www.toymoban.com/news/detail-609838.html

到了这里,关于new char与delete[]问题,疑惑点终得解开:为什么释放指向的内存空间后,其中的数据还可以继续访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++:new与delete

    其对自定义内省申请动态内存的操作是很简单的,我们直接看如下对自定义类型的操作。 区别于C语言的是, new来申请自定义空间,会去调用构造函数 delete删除也会主动调用析构函数。 因此有一种操作 类的内部禁用掉对应的operator new和operator delete那么,对这个类你就不能使

    2024年04月13日
    浏览(35)
  • C++ || C/C++内存管理 | C++动态内存管理方式 | operator new/delete函数 | new和delete实现原理 | 定位new表达式 | 内存泄漏

    C/C++中程序内存区域大致划分六个部分: 内核空间 (用户代码不能读写)、 栈 (向下增长)、 内存映射段 (文件映射、动态库、匿名映射)、 堆 (向上增长)、 数据段 (全局数据、静态数据)、 代码段 (可执行代码、只读常量)。 各自内存区域功能 栈 ,又叫做堆栈

    2024年02月21日
    浏览(54)
  • C++ :内存管理 new&delete

    目录 内存区域划分 C++的动态内存的管理方式   new new的基本使用方法  【注意事项】  delete  【注意】 new和delete操作自定义类型  operator new 和 operator delete  【关于自定义类型new申请内存】 【原理】  【调用顺序】  【连续开辟空间问题】  malloc/free和new/delete的区别 【说明

    2024年02月22日
    浏览(44)
  • C++ new/delete的使用

    1.虚拟地址空间 可执行程序(进程)的虚拟地址空间: 内核:操作系统 栈区:函数的形参,非静态的局部变量,函数现场保护数据等等,栈是向下增长的,栈顶是低地址,栈底是高地址,存储结构为“先进后出”,栈区是一块连续的内存区域。 共享库的内存映射区域:用于

    2024年02月15日
    浏览(29)
  • C++ new和delete详解

    说明: 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下) 堆用于程序运行时动

    2024年02月09日
    浏览(36)
  • C++ new和delete的使用

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 new和delete是C++里非常重要的两个,意味着从“自由存储(堆)”分配指定大小的内存和释放掉这些内存。这些用法哪怕初学者也会,但是今天要讲的不是这个。今天要讲的是使用中容易忽视的细节

    2024年02月09日
    浏览(46)
  • 【C++】内存管理(new与delete)

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章我们一起来学习C++的内存管理方式,实际上C++与C语言的内存管理模式是十分相似的,他们的内存

    2024年02月05日
    浏览(44)
  • 【C++】——内存管理(new和delete)

    在学习C语言的时候,我们学习了动态内存管理,也就是在堆上动态开辟一些内存供我们使用,虽然C语言内存管理的方法在C++中也可以使用,但还有一些地方是他无能为力的,所以我们今天来学习C++内存管理的方式。 在学习内存管理之前,我们先来认识一下C/C++中程序内存区

    2024年02月06日
    浏览(52)
  • C++内存管理(new和delete)

    目录 1. new/delete操作内置类型 2. new和delete操作自定义类型 3. operator new与operator delete函数  4 .new和delete的实现原理 1 .内置类型 2 .自定义类型 new的原理 delete的原理 new T[N]的原理 delete[]的原理 5. 定位new表达式(placement-new) 6. malloc/free和new/delete的区别 7.内存泄漏 内存泄漏分类 8.如

    2024年02月02日
    浏览(38)
  • C++如何进行内存管理 (new、delete)

    我成功是因为我有决心,从不踌躇。——拿破仑  本章是关于c++内存管理的文章,字数不多,内容简单,希望对你有所帮助!! 话不多说安全带系好,发车啦 (建议电脑观看) 。 附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或

    2024年02月08日
    浏览(99)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包