函数实现既能开辟新空间、又能对原来空间大小进行调整、并且能对新增部分设置为0

转载 2013年12月04日 18:07:45

getmem.h

#ifndef GETMEM_H_
#define GETMEM_H_

#include <stdlib.h>
#include <string>
using namespace std;

template<class T>
void getmem(T*& oldmem, int elems)
{
	typedef int cntr;
	const int csz = sizeof(cntr);
	const int Tsz = sizeof(T);
	if (elems == 0)
	{
		free(&(((cntr*)oldmem)[-1]));
		return;
	}
	T* pp = oldmem;
	cntr* p = (cntr*)pp;
	cntr oldcount = 0;
	if (pp)
	{
		p = (cntr*)pp;
		p--;
		oldcount = *(cntr*)p;
	}
	T* m = (T*)realloc(p, elems * Tsz + csz);
	*((cntr*)m) = elems;
	const cntr increment = elems - oldcount;
	if (increment > 0)
	{
		long startadr = (long)&(m[oldcount]);
		startadr += csz;
		memset((void*)startadr, 0, increment * Tsz);
	}
	oldmem = (T*)&(((cntr*)m)[1]);
}

template<class T>
inline void freemem(T* m)
{
	getmem(m, 0);
}

#endif

getmem.cpp

#include "getmem.h"
#include <iostream>
using namespace std;

int main()
{
	int* p = 0;
	getmem(p, 10);
	for (int i = 0; i < 10; i++)
	{
		cout << p[i] << ' ';
		p[i] = i;
	}
	cout << '\n';
	getmem(p, 20);
	for (int j = 0; j < 20; j++)
	{
		cout << p[j] << ' ';
		p[j] = j;
	}
	cout << '\n';
	getmem(p, 25);
	for (int k = 0; k < 25; k++)
	{
		cout << p[k] << ' ';
	}
	freemem(p);
	cout << '\n';

	float* f = 0;
	getmem(f, 3);
	for (int u = 0; u < 3; u++)
	{
		cout << f[u] << ' ';
		f[u] = 3.14159f;
	}
	cout << '\n';
	getmem(f, 6);
	for (int v = 0; v < 6; v++)
	{
		cout << f[v] << ' ';
	}
	freemem(f);

	system("pause");
	return 1;
}


C++中用new开辟内存空间和非new开辟内存空间的区别

#include using namespace std; class A { private: int n; public: A(int m):n(m) { } ...
  • yangshuangtao
  • yangshuangtao
  • 2015年04月22日 15:43
  • 2720

CentOS6.5下lv调整空间大小

转自:http://blog.csdn.net/andy_yf/article/details/7831482一、目的在使用CentOS6.3版本linux系统的时候,发现根目录(/)的空间不是很...
  • wonder4
  • wonder4
  • 2015年04月03日 19:35
  • 7358

C语言笔记(3)

数组遍历时要注意以下几点:最好避免出现数组越界访问,循环变量最好不要超出数组的长度 C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法 由于C语言是没有检查数组长度...
  • horseinch
  • horseinch
  • 2016年02月24日 19:43
  • 240

字符数组动态开辟空间和静态开辟空间

动态分配和静态分配超大空间出现的问题的解决
  • IT_dreamer1993
  • IT_dreamer1993
  • 2016年01月27日 02:00
  • 1852

【基础知识】C/C++动态开辟空间

记得自己去面试某公司的时候曾被问过C/C++d
  • zhenweiyu
  • zhenweiyu
  • 2014年06月19日 00:14
  • 655

Linux下调整目录的空间大小

一、目的 在使用CentOS6.5版本linux系统的时候,发现根目录(/)的空间不是很充足,而其他目录空间有很大的空闲,所以本文主要是针对现在已有的空间进行调整。首先,先来查看一下系统的空间分配情...
  • wangmuming
  • wangmuming
  • 2015年07月06日 17:55
  • 5738

C++ 动态开辟空间

C++动态开辟空间: 1.变长一维数组  这里说的变长数组是指在编译时不能确定数组长度,程序在运行时需要动态分配内存空间的数组。实现变长数组最简单的是变长一维数组,你可以这样做:  //...
  • chaoyuan899
  • chaoyuan899
  • 2013年03月07日 09:11
  • 6357

进程与线程栈大小的调整(精)

摘要 通过ulimit设置及可用的Pthread库接口来调整进程或线程的运行栈的大小,以改善嵌入式中内存的使用。 线程 栈大小 ulimit pthread 目录[-] 问题现象 现象分析...
  • u010154760
  • u010154760
  • 2015年04月27日 16:39
  • 2870

Oracle修改表空间大小

在向orale数据库导入数据的时候报 ORA-01658: 无法为表空间 XXX中的段创建 INITIAL 区错误。 Oracle我在创建表空间的时候初始化大小为200M,当数据库中数据...
  • u012789986
  • u012789986
  • 2017年03月10日 16:05
  • 391

make和gdb的简单应用

题目: A、以下是本次实验的内容一: ①实例文件有六个源文件 和六个头文件 分别是:func1.c  func2.c func3.c  func4.c  func5.c  main.c hea...
  • u014135961
  • u014135961
  • 2015年10月14日 16:36
  • 353
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数实现既能开辟新空间、又能对原来空间大小进行调整、并且能对新增部分设置为0
举报原因:
原因补充:

(最多只允许输入30个字)