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

临时变量的生命周期的有关问题

2012-03-22 
临时变量的生命周期的问题#includeiostreamusingnamespacestdclassBase{public:Base(char*pName){this-

临时变量的生命周期的问题
#include   <iostream>
using   namespace   std;

class   Base
{
public:
Base(char*   pName)
{
this-> pName   =   pName;
}
void   GetName()
{
cout < <pName < <endl;
}
private:
char*   pName;
};


int   main()
{
Base   x( "test ");
x.GetName();
return   0;
}


这段代码里, "test "的生命周期到哪里结束?    

如果是一个类对象作为参数,那么在执行x.GetName()前,对象的复本就会析构。如果 "test "字串也这样,那x.GetName()不就有可能出错了?或者说打印出来的内容不一定正确。


[解决办法]
> > 这段代码里, "test "的生命周期到哪里结束?
这里 "test "属于字符串常量,实际上编译器在编译的时候就把这个地址分配了.
所以准确的说从程序运行到结束, "test "都在内存中.

> > 如果是一个类对象作为参数,那么在执行x.GetName()前,对象的复本就会析构。如
> > 果 "test "字串也这样,那x.GetName()不就有可能出错了?或者说打印出来的内容不一定正确。
你说的没错,执行x.GetName之前,对象的副本会被析构, 但是这里 "test "并不是对象,只是一个常量.就好比static int n=5, 调用void fun(int m)一样, f(5)你能说5被析构么?

另外我想说得是,类里面对象pName是个指针,保存的就是这个常量在内存中的地址,即使这个对象x析构了,也只是说pName没有意义不能用了,但是不是说pName里面所指向的内存空间也同时被析构.
[解决办法]
就你这段代码来说应该不会出错
但是依赖于main函数的实现,因为 "test "是字符串常量,程序退出之前都存在。
而且只有这么一个简单的main函数,就算你用了局部变量也不会出什么问题。

其实就是说语法上没错,逻辑上有错。
在构造函数Base里面,你已经作了一个假定,就是外部传入的字符串一定比类的生命周期长,但是这样是不对的。
[解决办法]
999是一个int常量,存放在静态区。
它做参,传的是一个999这个值,而且是常量,
而构造函数的参,要求是int的引用pName,但pName没法初始化,因为pName不知道是哪块内存装的999,所以没法得到装999这块内存的地址(暂且认为是地址,引用是用多片内存对应实际一个数据),而C++是不允许空引用的。

热点排行