c++ - 如何最好地将递归结构体的本地生成元素保留在内存中?

标签 c++ struct scope

我有一个递归的树状结构(下面示例代码中的TestStruct),基本上是一个生成器函数,它接受其中一个并输出下一个。我的第一次尝试类似于下面的代码(不起作用)。我现在意识到 sub 变量仅存在于 gen_next 范围内,因此指针 (sub0,sub1 ) 父 TestStructs 中不再指向任何内容。

我对 C++(或具有这种内存控制级别的通用语言)没有太多经验,而且我真的不知道解决此问题的最佳方法。我想过将所有内容存储在全局变量中,但这看起来很困惑,而且我觉得我缺少一种更简单的方法来完成此任务。

#include <stdio.h>

struct TestStruct
{
    int type;
    struct TestStruct * sub0;
    struct TestStruct * sub1;

    TestStruct()
    {
        type = 0;
        sub0 = NULL;
        sub1 = NULL;
    }
    TestStruct(int type_init, TestStruct * sub0_init, TestStruct * sub1_init)
    {
        type = type_init;
        sub0 = sub0_init;
        sub1 = sub1_init;
    }
};

TestStruct gen_next(int size, TestStruct last)
{
    TestStruct empty;
    TestStruct sub;

    if (size==0)
    {
        if (last.type == 1)
            return TestStruct();
        if (last.type == 0)
            return TestStruct(1,NULL,NULL);
    }
    if (last.type == 0)
    {
        sub = gen_next(size-1,empty);
        return TestStruct(2,&sub,NULL); // bad code; sub will no longer exist!
    }

    if (last.type == 2)
    {
        sub = gen_next(size-1,*last.sub0);
        if (sub.type == 0)
            sub = gen_next(size-1,empty);
            return TestStruct(3,NULL,&sub);
        return TestStruct(2,&sub,NULL);
    }

    if (last.type == 3)
    {
        sub = gen_next(size-1,*last.sub1);
        if (sub.type == 0)
            return TestStruct();
        return TestStruct(3,NULL,&sub);
    }
    throw;
}

void print_struct(TestStruct test_struct)
{
    switch (test_struct.type)
    {
    case 0: printf("NONE");
        break;
    case 1: printf("END");
        break;
    case 2: printf("LEFT("); print_struct(*test_struct.sub0); printf(")");
        break;
    case 3: printf("RIGHT("); print_struct(*test_struct.sub1); printf(")");
        break;
    default: printf("INVALID:%d",test_struct.type);
    }
}

int main()
{
    TestStruct test;
    test = gen_next(3,test);
    print_struct(test);
    printf("\n");

    do {
        test = gen_next(3,test);
        print_struct(test);
    } while (test.type != 0);

    return 0;
}

最佳答案

如前所述,您无法解决这个问题。堆栈分配的内存不受您的控制。

您可以做的是动态分配内存,并使用适当的 smart pointer :

#include <memory>

struct TestStruct {
    int type;
    std::unique_ptr<TestStruct> sub0;
    std::unique_ptr<TestStruct> sub1;

    TestStruct() : TestStruct(0, nullptr, nullptr) {}

    TestStruct(int type_init,
               std::unique_ptr<TestStruct> sub0_init,
               std::unique_ptr<TestStruct> sub1_init)
    : type(type_init), sub0(std::move(sub0_init)), sub1(std::move(sub1_init)) {}
};

在您的 gen_next() 函数中,您将子节点创建为

std::unique_ptr<TestStruct> empty(new TestStruct);
std::unique_ptr<TestStruct> sub(new TestStruct);

并引用值,而不是地址,例如:

return TestStruct(2, std::move(sub), nullptr);

关于c++ - 如何最好地将递归结构体的本地生成元素保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30545047/

相关文章:

c++ - 将前向声明的类型转换为 void 是否合法?

c++ - 在 vector 中删除/更新结构值时出现编译错误?

c - 如何处理接口(interface)和实现中不完整的类型定义和前向声明

c - 为什么指向结构的指针会使程序崩溃?

function - 支持词法范围 ScriptBlock 参数(例如Where-Object)

javascript - Javascript 变量作用域问题

c++ - 语义略有不同的复制构造函数和赋值运算符中是否存在陷阱?

c++ - libcurl : showing running upload and download rate

c++ - 宏中使用的模板参数有问题

Javascript通过引用访问成员变量