vc2008,用基类指针显式删除非虚析构函数派生类对象

vc2008,用基类指针显式删除非虚析构函数派生类对象,第1张

LZ对这句话的理解存在误解

这句话的意思并不是说这样编译不过,而是说运行时比较有代表性的后果是对象的派生部分不会被销毁

也就是说,你这段程序在执行了delete pC;后C类中的char pcarray;被销毁了,但是D类中的int piarray;不会被销毁,发生了内存泄漏。

/Decomposeh/

#define IS_PRINT_FACTOR 1 //定义是否打印中间结果

class Decompose

{

private:

unsigned __int64 num;

unsigned __int64 sum;

int n;

public:

Decompose();

Decompose(int n,unsigned __int64 num);

virtual ~Decompose();

int primeNum(unsigned __int64 x,unsigned __int64 fac);

void primeNum();

void printSum();

};

以下是cpp文件

////////////////////////////////////////////////////////////////////////////////////

// Decomposecpp: implementation of the Decompose class

//

//////////////////////////////////////////////////////////////////////

#include "Decomposeh"

#include "stdioh"

#include "windowsh"

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

Decompose::Decompose()

{

num=NULL;

sum=NULL;

n=0;

}

Decompose::Decompose(int n,unsigned __int64 num)

{

this->n=n;

this->num=new unsigned __int64[n];

sum=new unsigned __int64[n];

for(int i=0;i<n;i++)

this->num[i]=num[i];

}

Decompose::~Decompose()

{

if(num!=NULL)

delete[]num;

if(sum!=NULL)

delete[]sum;

}

unsigned __int64 sqrt64(unsigned __int64 x)

{

int i=(sizeof(unsigned __int64)<<3)-1;

if(x==(unsigned __int64)1)

return (unsigned __int64)1;

while(i>=0)

{

if((x>>i)==1)

break;

i--;

}

return (unsigned __int64)1<<((i+2)>>1);

}

int Decompose::primeNum(unsigned __int64 x,unsigned __int64 fac)

{

unsigned __int64 i=2,sqrtx=sqrt64(x);

int flen=0;

while(i<sqrtx)

{

if(x%i==0)//if i is the factor of x

{

fac[flen++]=i;

x/=i;

sqrtx=sqrt64(x);

}

else if(i==2) i++;

else i+=2; //if x is not even,then the factor of x must be odd

}

fac[flen++]=x;

return flen;// flen is the number of integers in fac

}

void Decompose::primeNum()

{

unsigned __int64 fac[64];

int i,j,flen;

for(i=0;i<n;i++)

{

flen=primeNum(num[i],fac);

#if IS_PRINT_FACTOR

printf("%I64u=",num[i]);

for(j=0;j<flen;j++)

{

printf("%I64u",fac[j]);

if(j!=flen-1)

printf("x");

else printf("\n");

}

#endif

for(j=0,sum[i]=0;j<flen;j++)

sum[i]+=fac[j];

}

}

void Decompose::printSum()

{

int i;

for(i=0;i<n;i++)

printf("sum(%I64u)=%I64u\n",num[i],sum[i]);

}

void main()

{

LARGE_INTEGER t1,t2,frq;

unsigned __int64 num[]={1234,1234567,123456789,1234567891011,12345678910111213};

int i,n=sizeof(num)/sizeof(num);

Decompose d(n,num);

QueryPerformanceFrequency(&frq);

QueryPerformanceCounter(&t1);

dprimeNum();

QueryPerformanceCounter(&t2);

printf("\n");

dprintSum();

printf("\ntime=%f sec\n",(double)(t2QuadPart-t1QuadPart)/frqQuadPart);

}

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

程序正确照抄书上例题但是结果却有点不同显示不出析构函数例题中注释的那行应该要在结果中输出可是其它都对,就是不输出不知道为什么

#include<iostream>

#include<string>

using namespace std;

class Student

{public:

Student(int a1,string a2)

{cout<<"构造函数!"<<a1<<endl;num=a1;nam=a2;}

~Student() {cout<<"析构函数!"<<num<<endl;}/此为析构函数要输出/

void print();

private:

int num;string nam;

}s1(101,"刘德华"),s2(0,"张学友");

void Student::print()

{if(num==0) throw num;

else cout<<num<<" "<<nam<<endl;}

void A()

{s1print();s2print();}

int main()

{try {A();}

catch(int a1) {cout<<"num="<<a1<<",错误!"<<endl;}

return 0;}

解析:

如果你要使用C++标准库(iostream中的cout即C++标准库的东东),请不要使用低版本的编译器,例如在VC6中,这段程序就不能正确执行,即不能输出析构函数里的语句。

使用VC7(里的)就可以正确执行,使用LINUX和UNIX的GCC也没问题。

当然你也可修改析构函数里的cout<<"析构函数!"<<num<<endl;这句话为:

printf("析构函数!%d\n", num);

这样在VC6中就可以输出,因为printf不是C++标准库的,而是C标准库的。

#include<iostream>

using namespace std;

class a

{

public:

a()

{

cout<<"构造函数"<<endl;

}

~a()

{

cout<<"析构函数"<<endl;

}

};

int main()

{

a p;

p=new a;

system("pause");

delete p;

system("pause");

return 0;

}

这样是可以调用的

#include<iostream>

using namespace std;

class a

{

public:

a()

{

cout<<"构造函数"<<endl;

}

~a()

{

cout<<"析构函数"<<endl;

}

};

int main()

{

a b;

system("pause");

return 0;

}

这样在Dev-C++ 中调用不了析构函数

第二个 我在 vc60 中试过了 可以调用 析构函数的

析构函数是在类创建的对象消亡时才会调用的,而delete是删除由new创建的动态指针的,至于destory是什么,没听过

示例:

class A{ public : ~A(){cout<<"sss"; system("pause"); } }; //system语句是VC里使用的,若其他编译器删掉就行了。

void main(){ A ma; } 调用析构函数的时机是在main函数结束之后就会调用,因为这时类A创建的对象ma才消亡。

示例:

void main(){ int p =new int(4); delete p; }

delete主要用来释放由new创建的指针空间,若没有使用delete则这个指针的空间无法释放。

函数重载是面向对象多态性的其中一种体现形式

说简单点就是编译器根据参数表的不同调用相应不同的函数

先说一下构造函数

构造函数是在对象被创建时系统自动调用的,不能人为显式调用。

1。CDate();

2。CDate(int day);

3。CDate(int month,int day);

4。CDate(int year,int month,int day);

是四个同名函数,但他们的参数表不同

1 无参数

2 一个int型参数

3 两个int型参数

4 三个int型参数

1。CDate day1;------------------------CDate();

2。CDate day2(28);--------------------CDate(int day);

3。CDate day3(81);-------------------CDate(int month,int day);

4。CDate day4(2003,3,10);------------CDate(int year,int month,int day);

是四个创建CDate对象的语句,且他们分别提供0,1,2,3各参数

这样系统根据参数的不同调用四个构造函数中参数表与创建对象时所提供的参数表相匹配的一个

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12175507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存