C/C++中关于结构体指针的困惑

3
我想消除关于在类中使用作为成员的结构指针的混淆。我写了以下代码,但尽管程序编译通过,但会崩溃。请问以下代码有什么问题?
#include<stdio.h>
#include<string.h>

struct a{
    int s;
    int b;
    char*h;
};

class test
{
public:
    a * f;
    void dh();
    void dt();
};

void test::dh()
{
    a d;
    d.s=1;
    d.b=2;
    d.h="ffdf";
    f=&d;
}

void test::dt()
{
    printf("%s %d %d",f->h,f->b,f->s);
}

int main()
{
    test g;
    g.dh();
    g.dt();
    return 0;
}

1
谷歌“三法则”,然后使用智能指针代替。 - Mooing Duck
3个回答

8
void test::dh()
{
    a d; <--
    d.s=1;
    d.b=2;
    d.h="ffdf";
    f=&d; <--
}

您正在创建一个本地对象d,然后将f设置为此对象的地址。一旦函数结束,该对象就会超出作用域,留下一个悬空指针。

4
您最大的问题是,在dh()返回时,d已经不在作用域内。而不是在dh()中使用a d;,您需要使用f = new a(); f.s=1; f.b=2, f.h="ffdf";

声明 f=new a() 会导致内存问题的可能性吗? - the_naive
2
只要你有相应的“delete”,就没问题了。如果你担心,甚至如果你不担心,考虑使用智能指针。它们将为您释放内存。 - chris
2
@the_naive,从技术上讲是的。正确来说,你的代码应该预料到分配f可能会失败。在实践中,对于这么小的程序和数据结构,这种情况不太可能发生。你应该养成始终检查的习惯,但如果没有明确的恢复方式,有时最好的方法就是崩溃并结束它。 - sblom
非常感谢。从你这里学到了很多 :D。 - the_naive

2

在test::dh中,您将公共指针f分配为局部变量d的地址。当g.dh();退出时,d的地址不再有效,这就是为什么g.dt();中对f的引用失败的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接