c++ - Valgrind 在通过指向结构的指针访问结构成员时提示无效读取

标签 c++ pointers struct valgrind

结构体定义如下:

struct section_{
    int start;
    ...
};

出于我不会详细讨论的原因,我需要将指向结构的指针传递给接受 void* 的函数。 。该函数如下所示:

void* my_fun(void* sec){
    section_* section = (section_*)sec;
    int start = section->start; // <---- valgrind complains here
    ...
}

我有一个std::vector<section_*>我需要打电话my_fun在此 vector 的每个元素上。我这样做是这样的:

std::vector<section_*> sections = get_sections();
for (int i = 0; i < sections.size(); ++i){
    my_fun((void*)sections[i]);
}

get_sections()函数看起来像:

std::vector<section_*> get_sections(){
    std::vector<section_*> sections;
    section_ sec1;
    sec1.start = 0;
    ...
    sections.push_back(&sec1);
    return sections;
}

我已将问题跟踪到 my_fun 中的行这说的是

int start = section->start;

错误提示:

==3512== Invalid read of size 4
==3512==    at 0x41A970: my_fun(void*)
...
==3512==  Address 0xffeffa2a0 is on thread 1's stack
==3512==  14160 bytes below stack pointer

即使我得到无效读取,我仍然能够访问 my_fun 内的结构成员它们是正确的值。这是为什么?

我意识到这段代码是零散的,但实际的代码比我所展示的要复杂和冗长得多,尽管我认为我正在展示所有相关部分。我希望我提供的信息足够了。

最佳答案

正如@BoPersson 的评论中提到的,您向 vector 添加一个局部变量:

std::vector<section_*> get_sections(){
    std::vector<section_*> sections;
    section_ sec1;    // <- Local, temporary variable 
    sec1.start = 0;
    ...
    sections.push_back(&sec1); // <- Address of local var
    return sections;
    // When this function ends, sec1 is no longer valid
}

您可以使用 new创建sec1 (delete 稍后再讲)。或者将 vector 类型更改为std::vector<section_> sections; .

关于c++ - Valgrind 在通过指向结构的指针访问结构成员时提示无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37547543/

相关文章:

c++ - 错误 “no matching function for call ' begin(int [len] )' ”在我的代码中是什么意思?

c - 将结构体的地址分配给C中的其他结构体

c - 堆验证失败

go - 强制函数只接受类型,而不是类型的底层类型

c - 递归法计算二叉树高度的原理是什么?

c++ - 错误 : no matching function for call to

c++ - 意外的 std::io_base::failure 异常

c++ - 从类 C++ 外部调用指向成员方法的成员指针

function - 在外部函数中访问 Go 结构的值

c++ - 使用 DLL 和 C/C++ 遇到断点时的不同结果