1

構造体を含むクラスがあります。この構造体の新しいオブジェクトを作成するクラスのメソッドがあり、それをポインターとして返します。

このクラスには、この構造体へのポインターを受け取り、そのデータを出力する別のメソッドがあります。

唯一の問題は、印刷しようとすると、コンソールに奇妙なテキストが表示されることです。

コード例(実際のコードではありませんが、その原理):

// Header

class TestClass
{
    public:

        struct TestStruct
        {
            int ID;
            string Name;
        };

        TestClass::TestStruct* CreateStruct(string name, int id);
        void PrintStruct(TestClass:TestStruct* testStruct);
}

// C++ File

TestClass::TestStruct* TestClass::CreateStruct(string name, int id)
{

    TestStruct testStruct;

    testStruct.ID = id;
    testStruct.Name = name;

    TestClass::TestStruct *pStruct = &testStruct;

    return pStruct;

};

void TestClass::PrintStruct(TestClass::TestStruct* testStruct)
{

    cout << (testStruct)->ID << "\n";
    cout << (testStruct)->Name << "\n";

};

int Main()
{

    TestClass tClass;

    tClass.PrintStruct(tClass.CreateStruct("A name", 1));

}
4

1 に答える 1

3

ローカル変数へのポインターを返しているため、未定義の動作が発生しています。

TestClass::TestStruct* TestClass::CreateStruct(string name, int id)
{
    TestStruct testStruct;
    //...
    TestClass::TestStruct *pStruct = &testStruct;
    return pStruct;
}   //testStruct is destroyed here
    //the pointer pStruct is invalid

これを機能させるには、スマート ポインターを返すか、メモリを動的に割り当ててオブジェクトの有効期間を延長します。delete明示的に行う必要があることに注意してください。

TestClass::TestStruct* TestClass::CreateStruct(string name, int id)
{

    TestStruct* testStruct = new TestStruct;

    testStruct->ID = id;
    testStruct->Name = name;

    return testStruct;

};

また、実際にポインターが必要かどうかを真剣に考えてください。可能であれば自動変数を優先します。もし私があなたなら、私はするだろう:

TestClass::TestStruct TestClass::CreateStruct(string name, int id)
{

    TestStruct testStruct;
    testStruct.ID = id;
    testStruct.Name = name;
    return testStruct;
};

void TestClass::PrintStruct(const TestClass::TestStruct& testStruct) const
{
    cout << testStruct.ID << "\n";
    cout << testStruct.Name << "\n";
};
于 2012-06-22T07:13:36.923 に答える