这段代码虽然简单,但警告”在初始化成员列表中使用this” 似乎不容忽视

蓝鹰 2013-05-16 12:05:59

#include<iostream>
using namespace std;

class parent;
class child
{
public:
child(int x,int y,parent* p)
{
mX = x;
mY = y;
mp = p;
}

~child(){};
int mX;
int mY;
parent* mp;
};


class parent
{
public:
child mChild;

parent():
mChild(1,2,this){};

~parent(){};
void showData()
{
cout<<"child x:"<<mChild.mp->mChild.mX<<endl //vs2010下输出正常
<<"child y:"<<mChild.mp->mChild.mY<<endl //vs2010下输出正常
<<"parent Address:"<<(int)mChild.mp<<endl //vs2010下输出和realAddress是一致的
<<"parent realAddress:"<<(int)this<<endl;
}
};


int main()
{
parent p;
p.showData();
system("pause");
}


虽然代码运行没什么问题,但是我请教一下各位前辈,c++ 是否有标准规定 初始化成员列表中的操作 是在对象完成内存分配之后才会进行? 如果 没有这个标准,我是不是不能这么做了? 在公司的写的代码中,我为了使对象的成员内存能够保证连续,想把部分指针替换为实体,减少new 和delete操作,以提高代码运行时效率。所以才这么做。
...全文
165 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2013-05-30
  • 打赏
  • 举报
回复
引用 9 楼 mougaidong 的回复:
[quote=引用 5 楼 mougaidong 的回复:] LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
我的描述不太对,你的代码没有问题的原因,应该是你在这段代码
 child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
    }
中,没有拿指针p去做一些其他事情。 [/quote]
引用 9 楼 mougaidong 的回复:
[quote=引用 5 楼 mougaidong 的回复:] LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
我的描述不太对,你的代码没有问题的原因,应该是你在这段代码
 child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
    }
中,没有拿指针p去做一些其他事情。 [/quote]
引用 9 楼 mougaidong 的回复:
[quote=引用 5 楼 mougaidong 的回复:] LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
我的描述不太对,你的代码没有问题的原因,应该是你在这段代码
 child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
    }
中,没有拿指针p去做一些其他事情。 [/quote]
引用 9 楼 mougaidong 的回复:
[quote=引用 5 楼 mougaidong 的回复:] LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
我的描述不太对,你的代码没有问题的原因,应该是你在这段代码
 child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
    }
中,没有拿指针p去做一些其他事情。 [/quote]
引用 10 楼 ri_aje 的回复:
[quote=引用 7 楼 blackeagleX 的回复:] [quote=引用 1 楼 ri_aje 的回复:] 木啥问题啊,实际上 g++ 都没出警告。
-wall 呢? 不知道vc2010 为啥这样警告[/quote] 打开 -Wall 编译的。 我猜 vs 是想跟你说,虽然你主楼的代码没有问题,但是将 this 随便传的话很容易出问题,比如 child 的构造函数要是这样的话,就是 UB 了。没事和完蛋在代码上可能只有很小的差别,因此 vs 提醒你一下。

child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
        p->showData();
    }
[/quote]
蓝鹰 2013-05-30
  • 打赏
  • 举报
回复
引用 9 楼 mougaidong 的回复:
[quote=引用 5 楼 mougaidong 的回复:] LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
我的描述不太对,你的代码没有问题的原因,应该是你在这段代码
 child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
    }
中,没有拿指针p去做一些其他事情。 [/quote]
蓝鹰 2013-05-30
  • 打赏
  • 举报
回复
引用 10 楼 ri_aje 的回复:
[quote=引用 7 楼 blackeagleX 的回复:] [quote=引用 1 楼 ri_aje 的回复:] 木啥问题啊,实际上 g++ 都没出警告。
-wall 呢? 不知道vc2010 为啥这样警告[/quote] 打开 -Wall 编译的。 我猜 vs 是想跟你说,虽然你主楼的代码没有问题,但是将 this 随便传的话很容易出问题,比如 child 的构造函数要是这样的话,就是 UB 了。没事和完蛋在代码上可能只有很小的差别,因此 vs 提醒你一下。

child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
        p->showData();
    }
[/quote]
turing-complete 2013-05-16
  • 打赏
  • 举报
回复
LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
ztenv 版主 2013-05-16
  • 打赏
  • 举报
回复
可以这么传,虽然对像还没有构造完成,
Defonds 2013-05-16
  • 打赏
  • 举报
回复
如果对象已经有了,可以用
www_adintr_com 2013-05-16
  • 打赏
  • 举报
回复
只要 child 的构造函数里面没有访问 p 的成员或方法哪些, 就没有什么问题. 如果有访问就可能出现问题. 执行初始化列表的时候内存是已经分配好了的
ri_aje 2013-05-16
  • 打赏
  • 举报
回复
木啥问题啊,实际上 g++ 都没出警告。
ri_aje 2013-05-16
  • 打赏
  • 举报
回复
引用 7 楼 blackeagleX 的回复:
[quote=引用 1 楼 ri_aje 的回复:] 木啥问题啊,实际上 g++ 都没出警告。
-wall 呢? 不知道vc2010 为啥这样警告[/quote] 打开 -Wall 编译的。 我猜 vs 是想跟你说,虽然你主楼的代码没有问题,但是将 this 随便传的话很容易出问题,比如 child 的构造函数要是这样的话,就是 UB 了。没事和完蛋在代码上可能只有很小的差别,因此 vs 提醒你一下。

child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
        p->showData();
    }
turing-complete 2013-05-16
  • 打赏
  • 举报
回复
引用 5 楼 mougaidong 的回复:
LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
我的描述不太对,你的代码没有问题的原因,应该是你在这段代码
 child(int x,int y,parent* p)
    {
        mX = x;
        mY = y; 
        mp = p;
    }
中,没有拿指针p去做一些其他事情。
蓝鹰 2013-05-16
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
只要 child 的构造函数里面没有访问 p 的成员或方法哪些, 就没有什么问题. 如果有访问就可能出现问题. 执行初始化列表的时候内存是已经分配好了的
引用 3 楼 defonds 的回复:
如果对象已经有了,可以用
引用 5 楼 mougaidong 的回复:
LZ的代码就不存在构造函数中this指针暴露给外部的问题。 mChild 的生命周期,是在parent 生命周期内的。
引用 6 楼 hugett 的回复:
这样做是没有问题的。。
引用 4 楼 lianshaohua 的回复:
可以这么传,虽然对像还没有构造完成,
只是记得初始化列表好像有些特殊
蓝鹰 2013-05-16
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
木啥问题啊,实际上 g++ 都没出警告。
-wall 呢? 不知道vc2010 为啥这样警告
hugett 2013-05-16
  • 打赏
  • 举报
回复
这样做是没有问题的。。

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧