免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1902 | 回复: 6
打印 上一主题 下一主题

昨天的一段代码, 思考一下又回来了, 大家看看对不对... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-06 13:30 |只看该作者 |倒序浏览
int main(){
        string str = "abcdeeeee"; // step1
        // 这里应该是调用的是一个带一个参数的构造函数, 不是什么operator=,
         string类对象都没有构造, 哪里能调用类方法???

        char* c = (char*)str.c_str(); // step2
        // str.c_str() 函数返回的是一个const char*的指针, 它应该是指向str对象的
         一个公有变量(见step4), char*类型的指针, 该变量所指向的内存空间分配                  
         在堆里
         
        cout << "c: " << c << endl;
        // c: abcdeeeee c值可输出, c所指向的内存区域必在堆里

        str.append(10, '!'); // setp3
        // str追加10个!号
        cout << "str: " << str << endl;
        // str: abcdeeeee!!!!!!!!!!
        cout << "c: " << c << endl;
        // c的值不变, 故可见c指向的是与str不同的一片内存空间
        // 又str的值在栈中, 不可能相同

        c = "abc"; // step4
        cout << "c: " << c << endl;
        // c: abc
        // c的值可更改, 故c_str()函数返回的是对象str的一个公有变量
}

不知分析是否正确, 各位赏个脸, 看一看 : )

论坛徽章:
0
2 [报告]
发表于 2005-01-06 13:42 |只看该作者

昨天的一段代码, 思考一下又回来了, 大家看看对不对...

>;>;char* c = (char*)str.c_str(); // step2
>;>;// str.c_str() 函数返回的是一个const char*的指针, 它应该是指向str对象的一个公有变量(见step4), char*类型的指针, 该变量所指向的内存空间分配在堆里

这个不对吧?str分配在哪里,c指向的空间就在那里。一开始,c和str.c_str()的值是一样的,不信你打印一下看看

论坛徽章:
0
3 [报告]
发表于 2005-01-06 14:00 |只看该作者

昨天的一段代码, 思考一下又回来了, 大家看看对不对...

如果你写过String类,就会知道String类的数据存放可能是动态分配的,即可能str.append(10, '!');之后,可能存放数据的内存是根据数据长度重新分配的,你可以在c = (char*)str.c_str(); 然后print("%p ..试试

论坛徽章:
0
4 [报告]
发表于 2005-01-06 14:36 |只看该作者

昨天的一段代码, 思考一下又回来了, 大家看看对不对...

一个大小可变的数据结构,必然是通过动态申请/释放空间来完成的,这种数据结构通过库的形式提供出来,目的就是隐藏实现细节,何必一定要穷究在堆中还是栈中呢。

论坛徽章:
0
5 [报告]
发表于 2005-01-06 18:15 |只看该作者

昨天的一段代码, 思考一下又回来了, 大家看看对不对...

如果你们研究过c++的标准类库, 有很多这样的函数, 我们不可能使用一个我们不

清楚其指向的指针, 至少我认为那是很危险的, 如果str对象离开作用域, 那使用

指针c肯定会出错, 因为str在析构时会释放掉其内部变量所占用的空间.

不能时常上网, 有问题希望大家多指教... : )

论坛徽章:
0
6 [报告]
发表于 2005-01-06 20:57 |只看该作者

昨天的一段代码, 思考一下又回来了, 大家看看对不对...


  1. string str = "abcdeeeee"; // step1
  2. // 这里应该是调用的是一个带一个参数的构造函数, 不是什么operator=,
  3. //string类对象都没有构造, 哪里能调用类方法???
复制代码

这个应该是operator=,构造函数的形式是classname valname(parameter list);
string的构造函数有很多,可以参看basic_string.h中的内容,对模版类不熟,我说不来


  1. char* c = (char*)str.c_str(); // step2
  2. // str.c_str() 函数返回的是一个const char*的指针, 它应该是指向str对象的
  3. 一个公有变量(见step4), char*类型的指针, 该变量所指向的内存空间分配
  4. 在堆里
复制代码

c这是应该指向str的私有变量 _M_dataplus._M_p所指的地址。
//_CharT* _M_p; // The actual data..也就是指向str实际数据的内存处
详细请查看basic_string.h,我也是先炒现卖的…


  1. str.append(10, '!'); // setp3
  2. // str追加10个!号
复制代码

这里str的append函数会发现原来分配的内存空间不够了,会重新分配的,所以内存地址变了
可以用printf("address of c:%x ,str:%x ",c,str.c_str());看看


  1. cout << "str: " << str << endl;
  2. // str: abcdeeeee!!!!!!!!!!
  3. cout << "c: " << c << endl;
  4. // c的值不变, 故可见c指向的是与str不同的一片内存空间
  5. // 又str的值在栈中, 不可能相同
复制代码

这时他们的内存是不一样了,这时c指向的应该是被free或者delete的了……如果还用c操作这片内存是很危险的。如果中间有其他的动态分配内存的动作,很可能就修改了原来的内容。


  1. c = "abc"; // step4
  2. cout << "c: " << c << endl;
  3. // c: abc
  4. // c的值可更改, 故c_str()函数返回的是对象str的一个公有变量v
复制代码

c="abc";是重新把一个常量字符串的首地址赋给了c,而不是改变c原来指向的内存。要使用c指向的内存要使用*接指针或者用[]下标。要清楚指针和指针指向的内容。

论坛徽章:
0
7 [报告]
发表于 2005-01-06 21:16 |只看该作者

昨天的一段代码, 思考一下又回来了, 大家看看对不对...


  1. cout << "str: " << str << endl;
  2. // str: abcdeeeee!!!!!!!!!!
  3. cout << "c: " << c << endl;
  4. // c的值不变, 故可见c指向的是与str不同的一片内存空间
  5. // 又str的值在栈中, 不可能相同
复制代码

str是一个类的实例,它的成员变量是应该在栈中,但是它的私有变量_M_dataplus._M_p 这个指针指向的内存就不是了,应该是在堆中。是不是这样说呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP