在C ++中,制作成员变量值或指针有什么区别?例如,以下代码中pThread和thread之间的区别是什么:
class A {
public:
boost::thread *pThread;
boost::thread thread;
}
答案 0 :(得分:4)
区别在于对象的内存布局。
成员项目像结构一样存储 - 按顺序连续存储在内存中(可能有2-4-8个字节对齐,但另外一个接一个地顺序存储)。指针作为4/8字节指针存储在存储器地址中,而实际对象可以存储在存储器中的任何位置。
考虑你有结构
的情况struct grades {
unsigned char math;
unsigned char english;
unsigned char history;
unsigned char physics;
unsigned char chemistry;
unsigned char biology;
unsigned char computers;
};
结构的大小是7个字节。
现在,如果你有一个班级Student_member:
class Student_member {
unsigned long id;
struct grades _grades;
};
和一个Student_pointer类:
class Student_pointer {
unsigned long id;
struct grades *_grades;
};
然后类Student_member的内存大小将是4 + 7 = 11个字节(长+结构),它将被分配为连续块,而类Student_pointer的内存大小将是4 + 4 = 8字节(长+指针)和另外7个字节,分配在存储实际成绩的内存中的其他位置。
答案 1 :(得分:2)
不是很正式,当你有一个成员指针时,成员指向的对象不会指向指向它的对象的生命周期。指针指向的对象可以为NULL。您负责在需要时(通过新建)创建实例,并在不再需要时(通过删除)清除实例。
当你有一个成员实例(而不是一个指针)时,实例会在其父项的构造函数运行时创建,并在父项的析构函数运行时被销毁。
当你有一个通过指针的对象时,该对象可以在其他几个对象之间共享,因此持有指针的对象不一定是控制指向对象的对象。
答案 2 :(得分:1)
指针是您分配内容的内存地址的名称。因此它具有固定的大小(例如,在Intel x86架构上为32位)。
这意味着当创建A
对象时,pThread
字段将始终占用该32位来存储boost::thread
将有效驻留的内存地址。
如果您不使用指针,boost::thread
将作为A
对象的一部分完整地创建,因此它将占用与boost::thread
一样大的存储空间在堆栈内部,当创建A
对象时。
boost::thread
分配(并释放)内存,因此指针将指向有效地址且没有内存泄漏将离开。