函数实现既能开辟新空间、又能对原来空间大小进行调整、并且能对新增部分设置为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++抛出异常后还能对函数内的局部对象进行析构? http://segmentfault.com/q/1010000002498987

C++是如何确保出了异常还能调用析构函数的 c++ 链接 评论  更多 默认排序时间排序 3 个回答 答案对人有帮助,有参考价值 2 ...

你需要来自XXX的权限才能对此文件夹进行更改 win10

windows 10 删除文件夹出现问题: 你需要来自XXX的权限才能对此文件夹进行更改 你需要来自SYSTEM的权限才能对此文件夹进行更改...

您需要Administrators提供的权限才能对此文件进行更改

上篇:如何彻底卸载百度卫士?中讲到,百度卫士卸载后,中实际的文件并没有完全卸载,还是有一个服务在运行,想删除文件夹及相关的文件出现以下问题:想更改文件夹的操作权限也是拒绝访问!发现一个软件“IObit...

建立一个存储和处理字符串的类DelCharStr。构造函数:动态申请存储字符串所需内存空间,并且即能用指定的字符串也能用默认的值0为所声明的对象进行初始化。

建立一个存储和处理字符串的类DelCharStr。 (1)私有数据成员 char *s:字符串的首地址。 int len:该字符串的长度值。 (2)公有成员函数 构造函数:动态申请存储字符串...
  • zggzgw
  • zggzgw
  • 2017年04月20日 20:42
  • 278
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数实现既能开辟新空间、又能对原来空间大小进行调整、并且能对新增部分设置为0
举报原因:
原因补充:

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