⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heap.c

📁 PB 熟悉的哥们希望大家可以互相学习一下
💻 C
字号:
/************************************************************
 *                                                          *
 * Copyright (c) 2001-2007 McObject LLC. All Right Reserved.*
 *                                                          *
 ************************************************************/

/*
 * This sample demonstarates heap API usage. The API resembles
 * standard C runtime memory API, only every heap function takes
 * an additional parameter - heap handle that should be obtained via
 * mco_heap_init() call
 */

#include "platform.h"
#include <stdio.h>
#include <stdlib.h>
#ifndef _VXWORKS
    #include <malloc.h>
#endif 
#include "mco.h"

/* our application need 8K of dynamic memory, not that it MUST be
 * a power of 2 in size. Try to set otherwise, and get the
 * runtime fatal exception.
 */
#define HEAP_SIZE 8192

/* this is the starting address, could be just taken from the
 * the memory map, or if the OS is kind enough, could be
 * allocated with malloc
 */
void* start_address;
/* The address of the heap control structure must be allocated
 * prior to the heap initialization and must be passed into
 * the heap initialization API. Again this address could be
 * taken from the map, or malloc-ed if possible
 */
mco_heap_h app_heap;

static void _SH_(void)
{

    char text[] = 
    {
        "\nThis sample demonstarates heap API usage. The API resembles\n"
            "standard C runtime memory API, only every heap function takes\n"
            "an additional parameter - heap handle that should be obtained via\n""mco_heap_init() call\n"
    };

    char text1[] = 
    {
        "Copyright (c) 2001-2007 McObject LLC. All Right Reserved.\n\n"
    };

    printf("%s\n%s\nPress Enter to start", text, text1);
    getchar();
}


/* If the address is static this is of course not necessary
 */
void free_start_address(void* p)
{
    if (p)
    {
        free(p);
    }
}


static void errhandler(int n)
{
    printf("\neXtremeDB fatal error: %d", n);
    getchar();
    exit( - 1);
}


int main(void)
{
    uint4* buffer;
    uint4 size;
    int hhsize;

    _SH_();

    /* Get the size of the heap control structure. The heap control structure
     * address - heap header, must be provided by the application and
     * passed into the heap initialization API mco_heap_init() along with
     * the heap start address.
     */
    mco_runtime_start();
    hhsize = mco_heap_head_size();

    if (!(app_heap = (mco_heap_h)malloc(hhsize)))
    {
        printf("Invalid address for the heap header.\n");
        exit(0);
    }

    if (!(start_address = malloc(HEAP_SIZE)))
    {
        printf("Invalid head address\n");
        exit(0);
    }

    /* set fatal error handler */
    mco_error_set_handler(&errhandler);

    /* initialize application's heap */
    mco_heap_init(start_address, HEAP_SIZE, app_heap, "heap");

    if ((buffer = (uint4*)mco_malloc(app_heap, 500* sizeof(uint4))) == NULL)
    {
        exit(1);
    }

    size = mco_heap_usedsize(app_heap);
    printf("Size of block after mco_malloc of 500 longs: %u\n", size);

    /* Reallocate and show new size: */
    if ((buffer = mco_realloc(app_heap, buffer, size + (500* sizeof(uint4)))) == NULL)
    {
        exit(1);
    }

    size = mco_heap_usedsize(app_heap);
    printf("Size of block after mco_realloc of 500 more longs: %u\n", size);

    size = mco_heap_freesize(app_heap);
    printf("Left in the heap after mco_malloc of 1000 longs: %u\n", size);

    mco_free(app_heap, buffer);

    /* destroy application's heap and free up its starting address (if necessary) */
    mco_heap_destroy(app_heap);
    mco_runtime_stop();
    free(start_address);
    free(app_heap);
    printf("Press Enter to exit");
    getchar();
    PROG_EXIT(0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -