变量松散它的价值

时间:2016-03-15 07:36:55

标签: c++

我遇到了以下问题。我有一些课程:

class classA
{
public:
    std::vector< classB > elementsOfBClass;
}

classA::classA()
{
    int a = 1;
    int b[2] = {2,3};
    elementsOfBClass.pushBack(classB(a,b));
}

class classB
{
public:
    int a;
    int* b;

    classB(int a, int* b);
};

classB::classB(int aVal, int* bVal)
{
    a = aVal;
    b = bVal;
    LOG("%d",a);  // a=1 
    LOG("%d,%d",b[0],b[1]); //b[0] = 2 , b[1] = 3
    //If I output b[0] and b[1] here then it's ok
}

我也有一些使用这个类的代码:

classA classAObject = classA();
LOG("%d", classAObject.elementsOfClassB[0].a);  // a=1
LOG("%d,%d",classAObject.elementsOfClassB[0].b[0],classAObject.elementsOfClassB[0].b[1]); //Here is some strange issue. b[0] and b[1] is always some absolutely random values!

b [0]和b [1]是一些奇怪的值。你能帮我理解为什么吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

你的classB :: b成员不会复制b,只需要一个指向堆栈上分配的变量的指针。当ClassA contructr退出时,这会被覆盖。

你的classB应该拥有一个声明为b [2]的成员广告制作int *bVal的深层副本

答案 1 :(得分:0)

如果你有选择,可以使用智能指针和std :: container,例如std :: array(如果在编译时已知大小,需要C ++ 11)或std :: vector。它会让你免于头痛。