C++编程->内存函数


//_alloca 实例返回 void 指向分配空间,以确保为任何类型的对象存储正确对齐。 如果 size 为 0, _alloca 分配一个零的项目并返回了有效的指针该项目。
//_alloca 从程序堆栈分配 size 字节。 该分配空间自动被释放,当调用函数退出时 (而不是,在将只是超出范围时)。
void test1()
{
	int     size = 1000;
	int     errcode = 0;
	void    *pData = NULL;
	if (size > 0 && size < 1024)
	{
		pData = _alloca( size );
		printf_s( "Allocated %d bytes of stack at 0x%p",
			size, pData);
	}
	else
	{
		printf_s("Tried to allocate too many bytes.\n");
	}
}

 alloca包含在头文件malloc.h中,在某些系统中会宏定义成_alloca使用。

  注意:

  1)在调用 alloca的函数返回的时候, 它分配的内存会自动释放。也就是说, 用 alloca 分配的内存在栈上。所以释放不需要用户使用free。

  2)alloca不具可移植性,而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问题,因为他分配在栈上.

  总结:由于这些原因,alloca不宜使用在必须广泛移植的程序中, 不管它可能多么有用。

//  realloc  重新分配内存块。
void test3()
{
	long *buffer, *oldbuffer;
	size_t size;

	if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
		exit( 1 );

	size = _msize( buffer );
	printf_s( "Size of block after malloc of 1000 longs: %u\n", size );

	// Reallocate and show new size:
	oldbuffer = buffer;     // save pointer in case realloc fails
	if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) )) 
		==  NULL )
	{
		free( oldbuffer );  // free original block
		exit( 1 );
	}
	size = _msize( buffer );
	printf_s( "Size of block after realloc of 1000 more longs: %u\n", 
		size );

	free( buffer );
}

  realloc:

  重新分配内存并返回void类型,如果没有足够的内存扩展内存块,则原来的指向的内存指针无变化,并返回NULL;如果重新分配大小设为0,而释放原来的内存块, 并返回NULL。

//calloc 返回指向该分配空间。 存储空间指向返回值以确保为任何类型的对象存储正确对齐。 获取对一个类型的指针 void除了之外,将使用一个返回值的类型转换
//
void test2()
{
	long *buffer;

	buffer = (long *)calloc( 40, sizeof( long ) );
	if( buffer != NULL )
		printf( "Allocated 40 long integers\n" );
	else
		printf( "Can't allocate memory\n" );
	free( buffer );
}


  calloc:

  分配指定数目的元素,每个元素的大小由size指定, 并将其初始化为0,calloc调用malloc使用C++ _set_new_mode函数来设置新的处理方式,默认情况下,malloc 失败时不调用分配内存的处理程序例程。

  

//如果内存充足,则 malloc 返回无效的指针给分配的空间或 NULL。 若要返回指向类型的指针而不是 void,请对返回值使用类型转换。
//返回值指向的存储空间保证适合储存任何类型的对象,该对象有一个相对于基本对齐方式,更少或同样的对齐方式要求。

//如果内存充足,则 malloc 返回无效的指针给分配的空间或 NULL。 若要返回指向类型的指针而不是 void,请对返回值使用类型转换。
//返回值指向的存储空间保证适合储存任何类型的对象,该对象有一个相对于基本对齐方式,更少或同样的对齐方式要求。
void test4()
{
	char *string;

	// Allocate space for a path name
	string = malloc( _MAX_PATH );

	// In a C++ file, explicitly cast malloc's return.  For example, 
	// string = (char *)malloc( _MAX_PATH );

	if( string == NULL )
		printf( "Insufficient memory available\n" );
	else
	{
		printf( "Memory space allocated for path name\n" );
		free( string );
		printf( "Memory freed\n" );
	}

}

malloc:

  从堆上分配指定大小的字节数并返回void类型,如分配失败则返回NULL,malloc分配的字节数可能比指定的字节要多,这是由内存对齐方式决定的,malloc实际上调用了HeapAlloc函数, 因此malloc分配的内存也不能跨进程调用。



你可能感兴趣的:(C++编程->内存函数)