zoukankan      html  css  js  c++  java
  • 内存释放

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

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

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

    直接搬运的代码

    //main.cpp
    int a = 0; //全局初始化区
    char *p1; //全局未初始化区

    main()
    {
    int b; //栈
    char s[] = “abc”; //栈
    char *p2; //栈
    char *p3 = “123456”; //123456在常量区,p3在栈上。
    static int c =0;//全局(静态)初始化区
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
    strcpy(p1, “123456”); //123456放在常量区。编译器可能会将它与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
    ");return;
    }
    char* http_response = rt_malloc(512);
    if (http_response == RT_NULL)
    {
        rt_kprintf("No memory
    ");return;
    }
    
    struct hostent *remote_host;
    remote_host = gethostbyname(remote_server);
    if( remote_host == NULL )
    {
        rt_kprintf("DNS Failed
    ");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
    ");
            return;
        }
    
        // 第三步 连接remote
        if (connect(sock, (struct sockaddr *)&remote_sockaddr, sizeof(struct sockaddr)) == -1)
        {
            rt_kprintf("Connect fail!
    ");
            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
    
        char http_header[64] = {0,};
        sprintf( http_header , "POST %s HTTP/1.1
    ",remote_path);
        strcpy( http_request , http_header ); // 拷贝到请求缓冲区中
    
        // Http属性
        char http_attribute[64] = {0,};
        // 添加属性 比如 Host:192.168.1.106
    
        sprintf( http_attribute , "Host:%s
    " , remote_server);
        strcat( http_request , http_attribute);
        memset( http_attribute , 0 , sizeof(http_attribute));
    
        // 添加提交表单内容的长度 比如 Content-Length:19
    
        sprintf( http_attribute , "Content-Length:%d
    " ,strlen(http_content) );
        strcat( http_request , http_attribute);
        memset( http_attribute , 0 , sizeof(http_attribute));
    
        // 添加表单编码格式 Content-Type:application/x-www-form-urlencoded
    
        strcat( http_request , "Content-Type:application/x-www-form-urlencoded
    ");
        memset( http_attribute , 0 , sizeof(http_attribute));
    
        // HTTP首部和HTTP内容 分隔部分
        strcat( http_request , "
    ");
    
        // 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] = '';
    
        // 分析和输出结果
        char* presult = strstr( http_response , "
    
    ");
        int result_value = atoi( presult + strlen("
    
    ") );
        // value1和value2累加
        rt_kprintf("value1:%d value2:%d result:%d
    " ,
                   value1++, value2++,result_value );
    
        rt_memset(http_response , 0 , sizeof(http_response));
    
        // 关闭套接字
        closesocket(sock);
    
        // 延时5S之后又一次连接
        rt_thread_delay( RT_TICK_PER_SECOND * 10 );
    }
    

    }

  • 相关阅读:
    事务与隔离级别
    使用 Spring Boot 构建 RESTful API
    Dockerfile 指令详解
    Java 函数式编程--流操作
    Java ThreadLocal 的使用与源码解析
    node+express的html页面访问
    node+mysql数据库连接(入门)
    ensp的基础路由命令,接口,下一跳的配置,入门必备
    初识JSP/Severlet技术开发Web应用
    jQuery基础及选择器
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7277779.html
Copyright © 2011-2022 走看看