结构体指针数组 内存分配 释放
2010-07-23 11:51
579 查看
#include <iostream>
#include <vector>
#include <map>
#include <iterator>
#include <algorithm>
using namespace std;
typedef class student
{
public:
int number;
char* name;
}STU, *LPSTU;
vector<LPSTU>vec;
vector<LPSTU>::iterator iter;
map<int,LPSTU>mapstu;
map<int,LPSTU>::iterator itermap;
void main(void)
{
char* str1 = "YaoMing";
char* str2 = "T_MAC";
char* str3 = "Join";
LPSTU stu[3];
for (int n=0; n < 3; n++)
{
stu
= new student;
}
stu[0]->name = new char[strlen(str1)+1];
strcpy(stu[0]->name,str1);
stu[0]->number = 1;
stu[1]->name = new char[strlen(str2)+1];
strcpy(stu[1]->name,str2);
stu[1]->number = 2;
stu[2]->name = new char[strlen(str3)+1];
strcpy(stu[2]->name,str3);
stu[2]->number = 3;
int i = 0;
for(;i < 3 ; i++)
{
vec.push_back(stu[i]);
mapstu.insert(make_pair(stu[i]->number,stu[i]));
}
for (iter=vec.begin();iter!=vec.end();++iter)
{
cout<< (*iter)->name<<"/t"<< (*iter)->number<<endl;
}
for (itermap = mapstu.begin();itermap != mapstu.end(); ++itermap)
{
cout<<itermap->first<<"/t"<<itermap->second->name<<endl;
}
for( i = 0;i < 3 ; i++)
{
vec.pop_back();
mapstu.erase(stu[i]->number);
}
cout<<vec.size()<<"/t"<<mapstu.size()<<endl;
for( i = 0;i < 3 ; i++)
{
delete[] stu[i]->name;
delete stu[i];
}
}
指针数组:一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。
比如 int * a[10];它里边放了10个int * 型变量,由于它是一个数组,已经在栈区分配了10个(int * )的空间,也就是32位机上是40个byte,每个空间都可以存放一个int型变量的地址,这个时候你可以为这个数组的每一个元素初始化,在,或者单独做个循环去初始化它。
例子:
int * a[2]={ new int(3),new int(4) }; //在栈区里声明一个int * 数组,它的每一个元素都在堆区里申请了一个无名变量,并初始化他们为3和4,注意此种声明方式具有缺陷,VC下会报错
例如 :
int * a[2]={new int[3],new int[3]};
delete a[0];
delet a[10];
int * a[2];
a[0]= new int[3];
a[1]=new int[3];
delete a[0];
delet a[10];
这样申请内存的风格感觉比较符合大家的习惯;由于是数组,所以就不可以delete a;编译会出警告.delete a[1];
注意这里 是一个数组,不能delete [] ;
指针的指针;
int ** cc=new (int*)[10]; 声明一个10个元素的数组,数组每个元素都是一个int *指针,每个元素还可以单独申请空间,因为cc的类型是int*型的指针,所以你要在堆里申请的话就要用int *来申请;
看下边的例子 (vc & GNU编译器都已经通过);
int ** a= new int * [2]; //申请两个int * 型的空间
a[1]=new int[3]; //为a的第二个元素又申请了3个int 型空间,a[1]指向了此空间首地址处
a[0]=new int[4]; ////为a的第一个元素又申请了4个int 型空间,a[0] 指向了此空间的首地址处
int * b;
a[0][0]=0;
a[0][1]=1;
b=a[0];
delete [] a[0] //一定要先释放a[0],a[1]的空间,否则会造成内存泄露.;
delete [] a[1];
delete [] a;
b++;
cout<<*b<<endl; //随机数
注意 :因为a 是在堆里申请的无名变量数组,所以在delete 的时候要用delete [] 来释放内存,但是a的每一个元素又单独申请了空间,所以在delete [] a之前要先delete [] 掉 a[0],a[1],否则又会造成内存泄露.
相关文章推荐
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
- 结构体指针数组 内存分配 释放
- 三十二、数组、指针和字符串:动态内存分配和释放
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
- 数组、指针和字符串:动态内存分配和释放
- C++编程入门系列之三十二(数组、指针和字符串:动态内存分配和释放)
- 关于C++中结构体及其指针成员的内存分配和释放
- 鸡啄米:C++编程入门系列之三十二(数组、指针和字符串:动态内存分配和释放)
- C语言——指针与结构体 内存的动态分配
- C语言 内存分配 地址 指针 数组 参数 实例解析
- 结构体中的一维,二维指针和内存的释放
- C语言 内存分配 地址 指针 数组 参数 实例解析
- C语言中多维数组的内存分配和释放(malloc与free)(转)
- 字符数组和字符指针在分配内存时的差别
- 关于结构体内存分配及释放
- C语言中动态分配数组指针后如何释放
- 内存的堆分配和栈分配 & 字符数组,字符指针,Sizeof总结
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- C语言中多维数组的内存分配和释放(malloc与free)(转)
- 内存分配 指针和数组对比(已阅读)