在类的构造,析构函数中分析和回收空间的有关问题
在类的构造,析构函数中分析和回收空间的问题
1 通过一个对象调用构造函数和通过NEW分配空间后调用构造函数,这两者在分配对象成员空间的时间上有什么不一样。
比如
class A{
int a
}
A a; //定义对象
A *pa = new A;//分配指针空间
以上两种形式分别在什么时候分配了成员空间。
2 分别通过指针和对象变量调用类析构函数时,其成员空间何时被回收。
class A{
private:
int value;
public:
A(int a):value(a){}
void Assign(const A &);
int getvalue(){return value;}
};
void A::Assign(const A &a)
{
if (this != &a)
{
this-> ~A(); //调用了析构函数
new (this) A(a);
}
}
int main()
{
A a1(10);
A a2(100);
cout < <a1.getvalue() < <endl;
a1.Assign(a2);
cout < <a1.getvalue() < <endl;
system( "pause ");
return 0;
}
调用析构函数后成员空间不会立即释放吗?
如果不立即释放,要等到什么时候才会释放?
通过对象变量和指针变量调用析构函数有没有区别?
------解决方案--------------------
召唤 taodm 指点 C++ Primer 章节……
------解决方案--------------------
A a; //定义对象
这个是在定义的地方,如果是函数内定义,那么在进入这个函数的时候分配好空间,在A a的时候调用构造函数。
A *pa = new A;在new的时候分配空间。
------解决方案--------------------
1.
A a;//对象在栈上分配.
A *p = new A;//对象分配在堆上.
2.
析构函数本身来没承诺对空间的回收.一般是程序员在其中释放在构造函数中NEW得的空间.至于对"存放本类对象的非静态数据成员的空间"的释放则完全是调用析构函数之后的事.也就是说为你上面的那个类定义析构函数没有任何用处.
------解决方案--------------------
(1)引用高手的话
char s1[] = "aaaaaaaaaaaaaaa ";
char *s2 = "bbbbbbbbbbbbbbbbb ";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
=====================================
------解决方案--------------------
引用谭浩强的书的一句话:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给其他新对象使用!
LZ要多温习啊
1 通过一个对象调用构造函数和通过NEW分配空间后调用构造函数,这两者在分配对象成员空间的时间上有什么不一样。
比如
class A{
int a
}
A a; //定义对象
A *pa = new A;//分配指针空间
以上两种形式分别在什么时候分配了成员空间。
2 分别通过指针和对象变量调用类析构函数时,其成员空间何时被回收。
class A{
private:
int value;
public:
A(int a):value(a){}
void Assign(const A &);
int getvalue(){return value;}
};
void A::Assign(const A &a)
{
if (this != &a)
{
this-> ~A(); //调用了析构函数
new (this) A(a);
}
}
int main()
{
A a1(10);
A a2(100);
cout < <a1.getvalue() < <endl;
a1.Assign(a2);
cout < <a1.getvalue() < <endl;
system( "pause ");
return 0;
}
调用析构函数后成员空间不会立即释放吗?
如果不立即释放,要等到什么时候才会释放?
通过对象变量和指针变量调用析构函数有没有区别?
------解决方案--------------------
召唤 taodm 指点 C++ Primer 章节……
------解决方案--------------------
A a; //定义对象
这个是在定义的地方,如果是函数内定义,那么在进入这个函数的时候分配好空间,在A a的时候调用构造函数。
A *pa = new A;在new的时候分配空间。
------解决方案--------------------
1.
A a;//对象在栈上分配.
A *p = new A;//对象分配在堆上.
2.
析构函数本身来没承诺对空间的回收.一般是程序员在其中释放在构造函数中NEW得的空间.至于对"存放本类对象的非静态数据成员的空间"的释放则完全是调用析构函数之后的事.也就是说为你上面的那个类定义析构函数没有任何用处.
------解决方案--------------------
(1)引用高手的话
char s1[] = "aaaaaaaaaaaaaaa ";
char *s2 = "bbbbbbbbbbbbbbbbb ";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
=====================================
------解决方案--------------------
引用谭浩强的书的一句话:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给其他新对象使用!
LZ要多温习啊