首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++创建对象两个形式的疑问

2013-03-16 
c++创建对象两个方式的疑问/**c++创建对象两个方式ClassType 对象名ClassType *指针变量 new ClassType

c++创建对象两个方式的疑问
/**
c++创建对象两个方式
ClassType 对象名;
ClassType *指针变量 = new ClassType
而且也在网上看了他们的区别
结果测试发现和看的不一样如下:
按理第一种创建方式在作用域之外就会调用析构函数销毁,为什么作用域之外还能使用,而且输入输出文件内容还是一样
/*
#include <iostream>
#include <string>
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include <ostream>

#define num 12700
//num定义为12700是因为再多栈空间就不够了
using namespace std;


class student {
public:
   string name;
   double a,b,c,d,e,f,g,h;
   student() {
   name.append(1,(char)rand());
   }
//   ~student(){
//   //cout<<"destroy "<<name<<endl;
//   }
};
class control {
public:
vector<student> all;
//ofstream addop("addop.txt"); 这里为什么不能作为成员变量

public: 
void add(ofstream &addop) {
student arr[num];
for(int i=0;i<num;i++) {
arr[i].name.append("add");
if(i==0){cout<<arr[i].name<<endl;system("PAUSE");}
if(i==num-1){cout<<arr[i].name<<endl;system("PAUSE");}
all.push_back(arr[i]);
addop<<arr[i].name;   //输出
}
}

void add2(ofstream &addop,control & con) {
student arr[num];
for(int i=0;i<num;i++) {
arr[i].name.append("add2");
all.push_back(arr[i]);
addop<<arr[i].name;   //输出
}
}
};
int main() 
{
ofstream addop("addop.txt");
ofstream itop("itop.txt");
control con;
con.add(addop);
cout<<"size add"<<con.all.size()<<endl;
system("PAUSE");

con.add2(addop,con);
cout<<"add 2 size"<<con.all.size()<<endl;
system("PAUSE");
vector<student>::iterator it = con.all.begin();
while(it!=con.all.end()) {
//cout<<it->name;
itop<<it->name;  
it++;
}

addop.close();
itop.close();
return 0;
}
[解决办法]

引用:
但是新拷贝的在push_back(arr[i]);调用完毕后按理也会再次消失,不管怎么样push_back(arr[i])的实现不可能是new到堆里,那样的话不知道什么时候删除。所以我还是很疑惑?


push_back就是分配到堆里。栈大小在编译器就是确定的,容器在栈中使用的内存不过20多个字节。往容器中加的数据是使用容器的Allocator分配的内存保存的,默认Allocator与stl库的实现者有关,通常有的是直接使用new、malloc之类的,有的是小于一定大小的会使用内存池分配(当然也是分配到堆里,只是为了减少内存碎片而预先分配了一大块内存),大于这个大小的才使用new。你还可以写一个自己的Allocator控制内存的分配。
至于内存的释放,你相应调用pop_back或者clear的时候,这些内存会被释放或者重新放会内存池。

热点排行