为什么本例中c++析构函数不能正确释放内存及析构

doing820000 doing820000 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面一道C++习题的疑问,希望大家能帮我解决

习题:
编写一个类Sequence,在自由存储区中按照升序存储整数值的递增序列,序列的长度和起始值
在构造函数中提供.确保该序列至少有两个值,默认10个值,从0开始(0,1,2,3,4,5,6,7,8,9).需要
有足够的内存空间来存储该序列,再用要求的内容来填充.
提供show()函数列出该序列,以确保正确创建Sequence对象.
确保在销毁Sequence对象时,释放分配给序列的内存(注意:确保释放所有的内存!).创建一个
默认序列和一个随机序列,来演示这个类的操作.


这是一个控制台应用程序,我创建了两个类和一个main()函数:
Integer:存储整数值的节点类
Sequence:序列类

代码如下:
Integer类
Integer头文件
//Integer.h

#ifndef INTEGER_H
#define INTEGER_H
#include <stdlib.h>
#include <iostream>

class Integer //class Integer
{
public:
Integer(int newInt=0,Integer* pNewNext=0); //元素构造函数
void setInt(int value,int i); //设置元素整数值
int getInt() const; //获取元素整数值
void setNext(Integer* pInt); //设置元素整数值
Integer* getNext() const; //获取下一个元素

private:
int Int; //元素整数值
Integer* pNext; //指向下一个元素
};

inline int random(int count) //随机函数
{
return 1+static_cast<int>(count*rand()/(RAND_MAX+1));
}

#endif


Integer源文件
//Integer.cpp

#include "Integer.h"
#include <iostream>

using std::cout;

//构造节点
Integer::Integer(int newInt,Integer* pNewNext)
{
Int=newInt;
pNext=pNewNext;
}

//设置整数值
void Integer::setInt(int value,int i)
{
Int=value;
Int+=i;
}

//获取整数值
int Integer::getInt() const
{
return Int;
}

//添加新元素到尾部
void Integer::setNext(Integer* pInt)
{
pNext=pInt;
}

//获取下一个元素
Integer* Integer::getNext() const
{
return pNext;
}





Sequence类
Sequence头文件
//Sequence.h

#ifndef SEQUENCE_H
#define SEQUENCE_H

#include "Integer.h"

class Sequence
{
public:
Sequence(int count=10,int startValue=0); //构造函数
Integer* getFirstInt(); //获取序列第一个元素指针
Integer* getNextInt(); //获取序列下一个元素指针
~Sequence(); //析构函数

void addInt(int value,int i); //添加序列元素
void show(); //显示序列

private:
int startValue; //序列起始值
int count; //序列元素个数
Integer* pHead; //序列头指针
Integer* pCurrent; //序列当前指针
Integer* pTail; //序列尾指针
};

#endif

Sequence源文件
//Sequence.cpp

#include <iostream>
#include "Sequence.h"
#include "Integer.h"

using std::cout;
using std::endl;


//构造序列
Sequence::Sequence(int count,int startValue)
{
pHead=pCurrent=pTail=0;
if(count<2)
count=2; //个数小于是2,就设置2
for(int i=0;i<count;i++)
addInt(startValue,i); //设置序列及其整数值
this->count=count;
this->startValue=startValue;
}

//析构
Sequence::~Sequence()
{

cout<<"called"<<endl;//跟踪
//删除节点
while(pCurrent=pHead->getNext())//当前指针指向下一个元素
{
cout<<"call"<<endl;//跟踪
delete pHead;//删除节点
pHead=pCurrent;//头指针指向下一个节点
}
delete pHead;//删除最后节点
}

//添加节点
void Sequence::addInt(int value,int i)
{
Integer* pInt=new Integer;//创建节点

if(pHead)//检查序列不为空
{
pInt->setInt(value,i);//设置整数值
pTail->setNext(pInt);//添加节点到尾部
}
else//序列为空
{
pInt->setInt(value,i);
pHead=pInt;//设置头节点
}
pTail=pInt;//尾指针指向尾部
}

//获取序列第一个元素指针
Integer* Sequence::getFirstInt()
{
pCurrent=pHead;
return pCurrent;
}

//获取序列下一个元素指针
Integer* Sequence::getNextInt()
{
if(pCurrent)
pCurrent=pCurrent->getNext();//当前指针不为空,指向下一个节点
else
{
pCurrent=pHead; //当前指针为空, 指向头节点
}

return pCurrent;
}

//显示序列
void Sequence::show()
{
int line=0;//每行个数

pCurrent=pHead;
do{
cout<<pCurrent->getInt()<<' ';//输出整数值
line++;
if(line%10==0)
cout<<endl; //个数达到10换行
pCurrent=pCurrent->getNext(); //指向下一个元素
}while(pCurrent!=0);

cout<<endl;//换行
}


main()函数

//main.cpp

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <iostream>
#include "Integer.h"
#include "Sequence.h"

using std::cout;
using std::endl;

main()
{
Sequence list1;//默认序列
list1.show();//显示list1

Sequence list2(5,4);//赋值序列
list2.show();//显示list2

const int dimlimit=20;
srand((unsigned)time(0));//随机数种子

Sequence list3;
list3=Sequence(random(dimlimit),random(dimlimit));//随机序列
list3.show();//显示随机序列

return 0;
}

我的问题是为什么main()函数中定义的随机序列lists,也就是上面的这段代码:
Sequence list3;
list3=Sequence(random(dimlimit),random(dimlimit));//随机序列
list3.show();//显示随机序列
调用了show()函数后,不能正确释放内存及析构,而前面的list1,list2能正确析构?



...全文

相关推荐

深析C++析构函数

深析C++析构函数,C++中析构函数是相当重要一个知识点,也是个难点。文档对析构函数了部分分析,可能不怎么全,但一点深入,相互学习呵呵

AshlingR

没有虚析构或者纯虚析构的基类指针 为什么调用不到子类析构函数?

先知道:构造函数先造就别人在造就自己,析构函数先牺牲自己在牺牲别人(先构造基类,在构造自身类;先析构自身类,在析构基类) 再知道:虚析构或者纯虚析构都是用来解决 基类指针指向子对象时,子类没有析构的问题 最后知道:用vs命令提示器查看单个类对象:cl /d1 reportSingleClassLayou类名 文件名 先看代码: //测试虚析构函数指针 #include&lt;i...

moyahaozi

C++构造函数和析构函数顺序

构造函数   先看看构造函数的调用顺序规则,只要我们在平时编程的时候遵守这种约定,任何关于构造函数的调用问题都能解决;构造函数的调用顺序总是如下:   1.基类构造函数。如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序,而不是它们在成员初始化表中的顺序。   2.成员类对象构造函数。如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序,而不是它们出现在成员初始化表中的顺序。   3.派生类构造函数。   析构函数   析构函数的调用顺序与构造函数的调用顺序正好相反,将上面3个点反过来用可以了,首先调用派生类的析构函数;其次再调用成员类对象的析构函数;后调

weixin_38600696

C++对象在堆栈区的析构

C++对象在堆栈区的析构 一般人别乱下~我自己需要的。

redpan

深入c++中临时对象的析构时机的详解

c++中,临时对象一旦不需要,就会调用析构函数,释放其占有的资源;而具名对象则是与创建的顺序相反,依次调用析构函数。 c++源码: 代码如下:class X  {public:   int i;   int j;   ~X() {}   X() {}}; int main() {    X x1;    X();    x1.i = 1;    X x2;    }对应的汇编码: 代码如下:_main    PROC ; 11   : int main() {     push    ebp    mov    ebp, esp    sub    esp, 24               

weixin_38554781
评论 4
收藏 已收藏
分享
返回顶部
doing820000
C++ 语言 65,214 成员 250,514 内容