hur.cn - 华软网

 热门搜索

关于vector内存释放的问题,求高手指点

  作者:未知    来源:网络    更新时间:2010/12/3
直接贴代码和结果吧,不知道问题所在呀
#include <vector>
#include <string>
#include <iostream>
using namespace std;

struct student
{
int a;
char* ch;
student()
{
ch=new char[2];
cout<<"construct"<<endl;
}
~student()
{
if (ch!=NULL)
{
delete ch;
cout<<"delete"<<endl;
}

cout<<"destruct"<<endl;

};

void main()
{
vector<student> tt;

tt.push_back(*(new student));
cout<<"1"<<endl;
tt.push_back(*(new student));
cout<<"2"<<endl;
tt.pop_back();
cout<<"3"<<endl;
tt.pop_back();

}

运行结果
construct
1
construct
delete                  //这里为什么会调用析构函数...
destruct
2
delete
destruct
3
/// 犯错..
---华软 网友回答---
C++">
#include <vector>
#include <string>
#include <iostream>
using namespace std;

struct student
{
int a;
char* ch;
student()
{
ch=new char[2];
cout<<"construct"<<endl;
}
~student()
{
if (ch!=NULL)
{
delete ch;
cout<<"delete"<<endl;
}

cout<<"destruct"<<endl;
}  
};

void main()
{
vector<student*> tt;

student* t1 = new student;
tt.push_back(t1);
cout<<"1"<<endl;

student* t2 = new student;
tt.push_back(t2);
cout<<"2"<<endl;

tt.pop_back();
cout<<"3"<<endl;
tt.pop_back();

delete t1;
delete t2;
}

---华软网友回复---
..谢谢,然则我想知道的是析构函数调用的原因
---华软网友回复---
你能够单步追踪运行一下看看

---华软网友回复---
vector的容量 刚起头是1,你2次pushpack的时候是需要重新 设置容量的。
---华软网友回复---
由于vector是分配的是接连内存,当vector已经有一个元素,再插入一个新的元素到后面的话,
要将原来的元素移到新的内存位置(这个进程中会调用拷贝构造函数产生一个新的拷贝对象,将这个对象拷贝到新的内存位置,然后销毁原来的对象,则原来对象的析构函数被调用),然后再将新的元素拷贝到原来元素的内存位置。
这个是我的理解,不知道说的准不准确
---华软网友回复---
vector的容量 刚起头是1,你2次pushpack的时候是需要重新 设置容量的。致使内存重新分配,单步追踪下吧
---华软网友回复---
我看看怎么回事
  
*****************************************************************************
欢迎运用CSDN论坛专用阅读器 : CSDN Reader(附全数代码

http://feiyun0112.cnblogs.com/
---华软网友回复---
引用 5 楼 zhaoze87 的回复:
由于vector是分配的是接连内存,当vector已经有一个元素,再插入一个新的元素到后面的话,
要将原来的元素移到新的内存位置(这个进程中会调用拷贝构造函数产生一个新的拷贝对象,将这个对象拷贝到新的内存位置,然后销毁原来的对象,则原来对象的析构函数被调用),然后再将新的元素拷贝到原来元素的内存位置。
这个是我的理解,不知道说的准不准确
 +1

应该加个拷贝构造函数,否则vector重新分配内存的时候会发生浅拷贝,析构的时候会出问题

student(const student& other)
    {
        a = other.a;
        ch = new char[2];
        memcpy(ch,other.ch,2*sizeof(char));
        cout<<"copy construct"<<endl;
    }
---华软网友回复---
引用 1 楼 visualeleven 的回复:
C/C++ code

#include <vector>
#include <string>
#include <iostream>
using namespace std;

struct student
{
    int a;
    char* ch;
    student()
    {
        ch=new char[2];
        cout<<"constru……


+1  楼主要注意new了东西就要delete,就需要一个地方寄存new出的对象地址。1楼代码写的很明白了,仔细看看对比下吧。

析构调用:
1、delete
2、显示调用析构函数
3、生命周期结束,比如函数结束、程序结束等。

---华软网友回复---
你犯错的原因应该是在调用析构函数时,对象已经销毁,请仔细检查一下,应该掌握在哪创建在那里delete
---华软网友回复---
谢谢列位,看来是对vector的了解不够深,4,5楼和8楼的两位给出了我想要的结果,1楼和其余的列位给出了进一步我需要思量的东西,再次谢谢大家      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。