内存释放

栈区(stack)—由编译器自己主动分配释放,存放函数的參数值。局部变量的值等。

其操作方式相似于数据结构中的栈。
堆区(heap)—一般由程序猿分配释放。若程序猿不释放。程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是相似于链表
全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域。未初始化的全局变量和未初始化的静态                                  变量在相邻的还有一块区域。  程序结束后由系统释放。
常量区—常量字符串就是放在这里的。直到程序结束后由系统释放。上面的问题就在这里!!

!
代码区—存放函数体的二进制代码。

直接搬运的代码

//main.cpp

int a = 0; //全局初始化区

char *p1; //全局未初始化区

main()

{

int b; //栈

char s[] = “abc”; //栈

char *p2; //栈

char *p3 = “123456”; //123456\0在常量区,p3在栈上。

static int c =0;//全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。

strcpy(p1, “123456”); //123456\0放在常量区。编译器可能会将它与p3所指向的”123456”优化成一个地方。

}

复制代码

此外,还有realloc(又一次分配内存)、calloc(初始化为0)、alloca(在栈上申请内存,自己主动释放)等。

http://blog.csdn.net/xukai871105/article/details/17485349

char remote_server[] = “192.168.1.106”; // 主机IP地址或主机域名

char remote_path[] = “/add.php”; // 文件地址

int value1 = 10;

int value2 = 20;

void tcpclient(const char* host_name, int port)

{

(void)port;

(void)host_name;

int sock, bytes_received;

// HTTP请求和HTTP响应 缓冲区
char* http_request = rt_malloc(256);
if (http_request== RT_NULL)
{
    rt_kprintf("No memory\r\n");return;
}
char* http_response = rt_malloc(512);
if (http_response == RT_NULL)
{
    rt_kprintf("No memory\r\n");return;
}

struct hostent *remote_host;
remote_host = gethostbyname(remote_server);
if( remote_host == NULL )
{
    rt_kprintf("DNS Failed\r\n");return;
}

struct sockaddr_in remote_sockaddr;
remote_sockaddr.sin_family = AF_INET;
remote_sockaddr.sin_port = htons(80);
// remote_sockaddr.sin_addr.s_addr = inet_addr("192.168.1.106");
remote_sockaddr.sin_addr.s_addr =
                            *(unsigned long *)remote_host->h_addr_list[0];
rt_memset(&(remote_sockaddr.sin_zero), 0, sizeof(remote_sockaddr.sin_zero));

while(1)
{
    // 第二步 创建套接字
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        rt_kprintf("Socket error\n");
        return;
    }

    // 第三步 连接remote
    if (connect(sock, (struct sockaddr *)&remote_sockaddr, sizeof(struct sockaddr)) == -1)
    {
        rt_kprintf("Connect fail!\n");
        lwip_close(sock);
        return;
    }

    // Http内容,表单内容
    char http_content[64] = {0,};
    // 确定HTTP表单提交内容
    sprintf( http_content , "value1=%d&value2=%d" , value1,value2);

    // 确定 HTTP请求首部 比如POST /add.php HTTP/1.1\r\n
    char http_header[64] = {0,};
    sprintf( http_header , "POST %s HTTP/1.1\r\n",remote_path);
    strcpy( http_request , http_header ); // 拷贝到请求缓冲区中

    // Http属性
    char http_attribute[64] = {0,};
    // 添加属性 比如 Host:192.168.1.106\r\n
    sprintf( http_attribute , "Host:%s\r\n" , remote_server);
    strcat( http_request , http_attribute);
    memset( http_attribute , 0 , sizeof(http_attribute));

    // 添加提交表单内容的长度 比如 Content-Length:19\r\n
    sprintf( http_attribute , "Content-Length:%d\r\n" ,strlen(http_content) );
    strcat( http_request , http_attribute);
    memset( http_attribute , 0 , sizeof(http_attribute));

    // 添加表单编码格式 Content-Type:application/x-www-form-urlencoded\r\n
    strcat( http_request , "Content-Type:application/x-www-form-urlencoded\r\n");
    memset( http_attribute , 0 , sizeof(http_attribute));

    // HTTP首部和HTTP内容 分隔部分
    strcat( http_request , "\r\n");

    // HTTP负载内容
    strcat( http_request , http_content);

    // 发送Http请求
    send(sock,http_request,strlen(http_request), 0);

    // 获得Http响应
    bytes_received = recv(sock, http_response, 1024 - 1, 0);
    http_response[bytes_received] = ‘\0‘;

    // 分析和输出结果
    char* presult = strstr( http_response , "\r\n\r\n");
    int result_value = atoi( presult + strlen("\r\n\r\n") );
    // value1和value2累加
    rt_kprintf("value1:%d value2:%d result:%d\r\n" ,
               value1++, value2++,result_value );

    rt_memset(http_response , 0 , sizeof(http_response));

    // 关闭套接字
    closesocket(sock);

    // 延时5S之后又一次连接
    rt_thread_delay( RT_TICK_PER_SECOND * 10 );
}

}

时间: 2024-10-14 11:06:14

内存释放的相关文章

仿360加速球。(实现内存释放)

FloatCircleView的实现自定义view 创建WindowManager窗体管理类管理悬浮小球和底部大窗体 MyProgreeView手机底部窗体中小球的实现 FloatMenuView的实现 MyFloatService MainActivity的实现 现在手机上的悬浮窗应用越来越多,对用户来说,最常见的悬浮窗应用就是安全软件的悬浮小控件,拿360卫士来说,当开启悬浮窗时,它是一个小球,小球可以拖动,当点击小球出现大窗体控件,可以进行进一步的操作如:释放手机内存等等.于是借着慕课网的

zw版【转发·台湾nvp系列Delphi例程】.NET调用HALCON COM控件内存释放模式

zw版[转发·台湾nvp系列Delphi例程].NET调用HALCON COM控件内存释放模式 ------------------------------------方法一 :Imports System.Runtime.InteropServices Marshal.ReleaseComObject(COM物件)COM 物件 = Nothing 方法二 :COM 物件 = NothingGC.Collect()GC.WaitForPendingFinalizers() 方法三 :Import

linux内存释放

linux内存释放一.执行sync 命令强制吧内存中的数据刷到硬盘.二.执行 echo "1" > /proc/sys/vm/drop_caches  释放pagecache的内存三.可以关掉 echo "0" > /proc/sys/vm/drop_caches

js的内存释放初步理解

1.堆内存:定义对象或函数,首先都会开一个堆内存且有一个引用地址,如果有变量知道了这个引用地址,我们就说该堆内存被占用了,不能被销毁 2.堆内存释放或销毁:把所有知道该引用地址的变量赋值null,即没人知道该引用地址,浏览器就会在空闲的时候销毁它,也叫垃圾回收 3.栈内存:有两种类别,全局作用域和私有作用域 4.全局作用域的栈内存:页面关闭的时候,才会销毁 5.私有作用域的栈内存(只有函数执行的时候才有私有作用域): a.一般情况:函数执行会形成一个新的私有作用域,当私有作用域的代码执行完之后,

内存管理---内存释放

Linux内存释放函数之间的调用关系如下图所示 hi /*用虚拟地址进行释放*/ void free_pages(unsigned long addr, unsigned int order) { if (addr != 0) { VM_BUG_ON(!virt_addr_valid((void *)addr)); __free_pages(virt_to_page((void *)addr), order);/*具体的释放函数*/ } } void __free_pages(struct pa

JavaScript 内存释放测试

JS内部实现垃圾回收机制 无法立即释放 只要数据没有依赖关系 就会在下轮内存回收时清理 ! function () { var array = [] , count = 100*100*100*5 , time = +new Date ; while( count-- ) array.push( document.createElement('el') ) ; console.log( +new Date - time, array.length ) ; count = 100*100*100*

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

c++中指针的内存申请和内存释放问题

C++中指针在new和delete操作的时候对内存堆都做了些什么呢,以下解: 1.指针的new操作: 指针在new之后,会在内存堆中分配一个空间,而指针中存放的是这个空间的地址.如: void main(){ int *p = new int(4); cout << p << endl; cout << *p << endl; } 输出为: 0x00431BF0 4 分别为分配的空间地址和地址内存放的值. 如果写为: void main(){ int *p

[super dealloc]内存释放的先后顺序

Objective-c 语言中最头疼的事就是内存释放,申明一个变量后记得一定要释放这个变量,相信很多人在dealloc函数[super dealloc]位置这问题上纠结过,经过实践发现,[super dealloc]写在自己释放的内存之前,经常会发生crash,而写在之后不会.对,Objective-c 中不能把自己写的释放内存放在[super dealloc]之后,原因是“你所创建的每个类都是从父类,根类继承来的,有很多实例变量也会继承过来,这部分变量有时候会在你的程序内使用,它们不会自动释放

谈谈Linux内存释放

上上周吧,一个朋友问我说他公司的服务器内存free 为0 是为什么,意思大概是内存去哪了,这引发了一个小小的讨论,也就是内存释放的问题… 首先我们可能会用free 去查看内存的使用率,它应该是这样的 [[email protected] ~]# free -m total used free shared buffers cached Mem: 32040 31707 332 0 498 27649 -/+ buffers/cache: 3559 28480 Swap: 16087 0 1608