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++编程->内存函数)