C++ 变量松开它';s值

C++ 变量松开它';s值,c++,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; cla

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

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
}
b[0]和b[1]是一些奇怪的值。你能帮我弄明白为什么吗


谢谢大家!

您的classB::b成员不复制b,只获取指向堆栈上分配的变量的指针。当ClassA构造函数退出时会被覆盖


您的classB应该保存一个声明为b[2]的成员,并创建一个
int*bVal

的深度副本。您的classB::b成员不创建b的副本,只需获取一个指向堆栈上分配的变量的指针。当ClassA构造函数退出时会被覆盖


您的classB应该保存声明为b[2]的成员,并制作
int*bVal

的深度副本。如果您有选择,请使用智能指针和std::容器,如std::array(如果编译时已知大小,则需要C++11)或std::vector。它将使您免于头疼。

如果您有选择,请使用智能指针和std::容器,如std::array(如果编译时已知大小,则需要C++11)或std::vector。这将使你免于头痛。

请给出一个简单、完整且可验证的示例:你希望如何管理
b
指向的对象的生命周期?你为什么要用指针呢?您试图实现什么?在向量中存储一个指向局部变量
intb[2]
的指针<当
classA
构造函数退出时,code>b被销毁,在向量中留下一个悬空指针。要解决这个问题,您可以将
classB
更改为具有
std::array b,或
std::vector b
。请发布一个最小、完整且可验证的示例:您希望如何管理
b
指向的对象的生命周期?你为什么要用指针呢?您试图实现什么?在向量中存储一个指向局部变量
intb[2]
的指针<当
classA
构造函数退出时,code>b
被销毁,在向量中留下一个悬空指针。要解决这个问题,您可以将
classB
更改为具有
std::array b,或
std::vector b
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!