gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:41:05 25 4
gpt4 key购买 nike

结构定义如下:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com