1

我有以下问题。我创建了一个类,并将指向该类的指针存储在另一个类中。创建后,一切正常。然而,一步之后,该类似乎消失了。

我在这里写了一个非常简单的测试场景:

#include <iostream>

using namespace std;

class test
{
    public:
        test();
        bool ok;
};

test::test()
{
    ok = false;
}

class func
{
    public:
        func();
        void check();
        test *pTest;
};

func::func()
{
    test temptest = test();
    cout << temptest.ok << endl;
    pTest = &temptest;
    cout << pTest->ok << endl;
}

void func::check()
{
    cout << pTest->ok << endl;
};

int main( int argc, char *argv[] )
{
    func mFunc = func();
    // what happens here
    mFunc.check();
}

上述程序输出以下内容:

0
0
204

从 204 开始,我猜我之前创建的类不知何故消失了。

你能告诉我发生了什么,为什么?

4

4 回答 4

1

以上都是正确的。我希望您正在寻求的简单解决方案是

pTest = new test();

而不是分配给局部变量,然后获取指向该变量的指针。

于 2012-12-08T22:50:44.813 回答
1

问题是您正在创建一个具有“有限”范围的对象。

func::func()
{
    test temptest = test();             // temptest construction
    cout << temptest.ok << endl;
    pTest = &temptest;
    cout << pTest->ok << endl;
}                                       // temptest descrution 

func 构造完成后,pTest 现在引用了一个无效对象。

您必须使用动态内存或共享指针来管理指针。

#include <iostream>

using namespace std;

class test
{
    public:
        test();
        bool ok;
};

test::test()
{
    ok = false;
}

class func
{
    public:
        func();
       ~func();
        void check();
        test *pTest;
};

func::func()
{
    pTest = new Test();
    cout << pTest->ok << endl;
    cout << pTest->ok << endl;
}
func::~func() { delete pTest; }

void func::check()
{
    cout << pTest->ok << endl;
};

int main( int argc, char *argv[] )
{
    func mFunc = func();
    // what happens here
    mFunc.check();
}

现在 test 的构造函数分配一个新对象并存储该对象的地址,析构函数可以释放内存。以这种方式管理内存不是一个好的策略。

使用共享指针而不是 shared_ptr 或 unique_ptr,但这需要一些其他知识,例如移动语义。

于 2012-12-08T22:54:46.607 回答
0

func 对象的生命周期超出了包含的 pTest 对象实例的生命周期。

一旦构造函数 func 返回,其成员 pTest 所指向的对象现在不再有效(temptest,当 func::func 返回时,func::func() 范围内的 test 的自动/堆栈实例已被销毁)。

于 2012-12-08T22:48:52.330 回答
0

temptest当调用 func 类函数 func() 时,该对象被分配到堆栈上。然后将该内存的地址存储在指针中pTest。当函数 func() 超出范围时,堆栈展开并且对象temptest被破坏。指针pTest现在指向产生未定义结果的未分配数据。

像这样创建的对象:

test t;

被称为自动对象,当它们超出范围时会自动释放。

您应该阅读动态分配数据和使用自动对象的区别。您还可以阅读有关堆栈内存的信息,我认为这可以为这个问题带来一些启示。

于 2012-12-08T22:52:23.847 回答