【问题标题】:Struct gets zeroed when function runs out? [duplicate]函数用完时结构归零? [复制]
【发布时间】:2018-02-02 13:50:22
【问题描述】:

这可能是一个菜鸟问题,但我什至不知道该用谷歌搜索什么。

我正在尝试实现一个 fuse 文件系统,但在传递结构时遇到了问题,这可能是因为我对 C++ 缺乏经验。

static int getStat(std::string path, struct stat *stout)
{
    ...
    struct stat *st = new struct stat();
    lstat(path.c_str(), st);
    // lstat correctly filled st according to gdb
    ...
    stout = st;
    // values are correctly copied to stout according to gdb
}

void something()
{
    struct stat *st = new struct stat(); // this might also be stack allocated by fuse, idk
    getStat("/", st);
    // but st is all zero now !?
}

我错过了什么?如何正确地将我的数据从函数中取出?

【问题讨论】:

  • 不确定你是否省略了它,但请注意getStat 必须返回一个值,否则你有 UB。
  • 如果在分配和重新分配给 stout 之前不 delete 结构,也存在潜在的内存泄漏。
  • 不要在堆上分配统计数据(不要新)!在堆栈上分配并将地址传递给 lstat。
  • 另一个问题:你真的需要动态分配结构吗? 两次?
  • 另请注意,在声明变量时使用struct 是C-ism,在C++ 中不需要。

标签: c++ struct scope


【解决方案1】:

您必须传递一个双指针才能在调用函数中反映更改的指针。

这就是解决方案

static int getStat(std::string path, struct stat **stout)
...
getStat("/", &st);

中,函数参数始终按值传递(引用除外)。这意味着在函数getStat() 中,stout 是函数调用中传递的指向结构的指针的副本。

所以,当新地址在函数内分配给stout时,这对something()中指向结构的原始指针没有影响(因为getStat()中的stout只是st的一个副本在main())。

由于我们在,您可以按照@SomeProgrammerDude 的建议使用参考。

static int getStat(std::string path, struct stat& stout)
struct stat st;
getStat("/", st);

【讨论】:

  • 为什么在 C++ 编程时使用“双指针”? C++ 有传递引用。
  • 只是对问题的解释。
  • 请注意,该问题被标记为 C++ 而不是 C。在 C++ 中,您不需要像在 C 中那样模拟传递引用,因为 C++ 具有本机引用.
  • 我知道并且我提到过,但我只是想让他明白为什么它不起作用。
  • @Cobra_Fast 您不需要指针来将对象存储在地图(或任何其他容器)中。从存储普通对象实例开始。如果您有大量对象,通常没关系,有一些方法不必复制大型容器。并且只复制一个对象通常比你想象的要快。不使用指针也意味着更少的内存泄漏、杂散指针的机会,并且实际上 saves 一些内存,因为实际指针不需要空间(是的,指针也需要内存空间,而不是只有对象)。
猜你喜欢
  • 2021-09-18
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多