`

c++ 动态内存分配

c++ 
阅读更多
先看一段代码:


[cpp] view plaincopy

    #include<iostream> 
    using namespace std; 
    void GetMe(char *p,int num) 
    { 
        p=(char*)malloc(sizeof(char)*num); 
         
    } 
    int main() 
    { 
        char *str=NULL; 
        GetMe(str,100); 
        strcpy(str,"Hello!"); 
        cout<<str<<endl; 
        return 0; 
    } 


该代码运行崩溃,原因是str并没有实际获得指针p开辟的内存空间。在函数GetMe中,p实际上是主函数中str的一个副本,p申请了内存,只是把p指向的内存地址改变,而str并没有改变,所以str依然没有获得内存,在执行字符串复制时就会出错。而且每次p申请的内存都不会得到释放,最终会造成内存泄露。


我们可以更改以上代码如下:


[cpp] view plaincopy

    #include<iostream> 
    using namespace std; 
    char* GetMe(char *p,int num) 
    { 
        p=(char*)malloc(sizeof(char)*num); 
        return p; 
    } 
    int main() 
    { 
        char *str=NULL; 
        str=GetMe(str,100); 
        strcpy(str,"Hello!"); 
        cout<<str<<endl; 

[cpp] view plaincopy

    <span style="white-space:pre">  </span>delete str; 
        return 0; 
    } 


在该代码中我们为p申请了空间,并将该空间的地址作为返回值传给str,这样str就指向了p申请的内存空间。还有一种修改方法是:传递str的指针:



[cpp] view plaincopy

    #include<iostream> 
    using namespace std; 
    void GetMe(char **p,int num) 
    { 
        *p=(char*)malloc(sizeof(char)*num); 
         
    } 
    int main() 
    { 
        char *str=NULL; 
        GetMe(&str,100); 
        strcpy(str,"Hello!"); 
        cout<<str<<endl; 
        delete str; 
        return 0; 
    } 


在该代码中传递了str的指针给函数GetMe(),那么p就是str的地址的副本,地址的副本可定就是该地址了,所以该函数是为str地址指向的str开辟空间。所以能正确输出结果。

1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 union myunion{
  5 char charvar;
  6 int intvar;
  7 float floatvar;
  8 };
  9 void swap(int ** p1, int **p2)
10 {
11 //会产生临时变量,所以使用二级指针
12   int *tmp;
13
14   tmp = *p1;
15   *p1 = *p2;
16   *p2 = tmp;
17 }
18
19
20 int main()
21 {
22
23   union myunion *uni = malloc(sizeof(float));
24
25   int a= 10, c= 20;
26   int *aa = &a;
27   int *cc = &c;
28   fprintf(stdout,"aa is:%d\t cc is: %d\n", *aa, *cc);
29   swap(&aa,&cc);
30   printf("swap ...........");
31   fprintf(stdout,"aa is:%d\t cc is: %d\n", *aa, *cc);
32   fprintf(stdout,"a is:%d\t b is: %d\n", a, c);// 不变,变的只是指针本身指向的地址而已
33
34   printf("---------------\n");
35
36   free(uni);
37
38   return 0;
39 }


分享到:
评论

相关推荐

    C++动态内存分配

    ### C++动态内存分配:掌握高效编程的关键 在C++编程的世界里,动态内存分配是一项核心技能,它赋予程序员在运行时决定数据存储大小的能力,从而优化资源管理和提高程序的灵活性。本文将深入探讨C++中的动态内存...

    C++动态内存分配研究

    ### C++动态内存分配研究 #### 一、内存分配方式 C++作为一种强大的面向对象编程语言,继承了C语言的基础并引入了许多高级特性。在C++中,内存管理是一项复杂而重要的任务,对于提高程序的稳定性和性能至关重要。...

    C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...

    操作系统动态内存分配实验报告 C++

    操作系统动态内存分配是计算机科学中一个关键的概念,尤其是在C++编程语言中。动态内存分配允许程序在运行时根据需要请求和释放内存,而非在编译时预设固定的内存大小。这种方式提高了程序的灵活性,但同时也增加了...

    C和C++动态内存分配如堆,栈,数据段

    ### C和C++中的动态内存分配详解:堆、栈、数据段 #### 一、C语言中的内存区域 在C语言中,程序运行时的内存主要分为以下几个区域: 1. **栈区**:由编译器自动分配和释放。主要用于存放函数调用时的局部变量、...

    C++动态内存分配研究.pdf

    在C++编程中,动态内存分配是一个至关重要的概念,它涉及到程序在运行时根据需要分配和释放内存。本文深入探讨了C++中的内存分配方式、动态内存管理的关键运算符new和delete,以及如何应对常见的内存错误。 首先,...

    详解C++ 动态内存分配与命名空间

    C++ 动态内存分配与命名空间 C++ 动态内存分配是指在程序运行时根据需要动态分配内存空间的机制。C++ 提供了 new 关键字来实现动态内存分配。new 关键字可以根据类型来进行动态内存分配,而不是像 C 语言那样基于...

    动态内存分配与回收 c/c++

    在编程领域,尤其是在C/C++中,动态内存分配与回收是一项关键技能,它涉及到程序运行时内存的管理和优化。动态内存分配允许程序在运行时根据需要请求和释放内存,而不是在编译时就预设固定的内存空间。这使得程序...

    动态内存分配实验报告

    在C++编程语言中,动态内存分配主要通过`new`和`delete`关键字来实现。本实验报告主要探讨了如何模拟动态内存分配的过程,以加深对操作系统内存管理的理解。 实验目的在于设计一个能够模拟内存分配状态的程序,通过...

    c++动态分配内存的介绍

    c++动态分配内存的介绍,对c++内存有很好的介绍

    Windows内存管理机制及C++内存分配

    理解并熟练掌握Windows内存管理和C++内存分配对于编写高效、可靠的程序至关重要。通过合理的内存管理,我们可以避免内存泄漏、提高程序性能,并确保系统的稳定性。在实践中,结合使用各种内存分配策略,可以更好地...

    关于C++动态分配内存的介绍

    C++动态分配内存介绍 C++动态分配内存是指在程序执行过程中,根据需要动态地分配和释放内存的过程。这种机制允许程序根据需要申请和释放内存,从而提高内存的使用效率。 内存管理器(Memory Manager,简称MM)是...

    C++内存分配详解

    C++内存分配详解 在C++编程中,内存管理是一个重要的概念,因为它直接影响到程序的性能和资源使用。内存主要分为四个主要区域:栈区、堆区、全局区(静态区)以及文字常量区。下面我们将详细探讨这些区域以及它们...

    C++实现动态分配内存

    C++实现动态分配内存 C++中的 vector 是一个多功能的容器,可以存放各种类型的对象,简单地说,vector 是一个能够存放任意类型的动态数组,可以动态改变大小。下面是对 vector 的详细介绍: 1. vector 的概述 ...

    C++内存分配情况

    C++内存分配情况 C++内存分配是C++编程中的一個重要概念,它涉及到内存的管理和分配。在C++中,内存分成五个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。每个区的特点和使用场景都不同,了解这些区的...

Global site tag (gtag.js) - Google Analytics