gpt4 book ai didi

C++ 双端队列抛出段错误

转载 作者:行者123 更新时间:2023-11-30 02:42:15 26 4
gpt4 key购买 nike

我有一些项目代码似乎无法正常工作。

我正在尝试制作一个(结构的)双端队列,它是一个类的静态成员。框架/基本代码如下(我保留了所有数据类型——my_typedef_fn 是通过函数指针 typedef 得到的数据类型):

1.h 文件:

class A {
struct Bstruct {
char * b_name;
my_typedef_fn b_func;
}
static std::deque<Bstruct> a_deque;
static void func();
}

1.cpp文件:

std::deque<A::Bstruct> A::a_deque;
void A::func(char * name, my_typedef_fn fn) {
a_deque.push_front((Bstruct) {name, fn} ); // <<<< segfault !
}

据我了解 - .h 文件只是声明内容(像往常一样) - .cpp 中的第一行初始化静态成员 a_deque - 函数 func 使用 push_back 添加内容到双端队列

但是我在调​​用 push_front 的那一行遇到了一个段错误(使用 gdb 找到的)。

此外,当我在 push_front 之前打印 a_deque.size() 时,我在 SEGFAULT 之前得到 4294967264当我使用 for 循环计算双端队列中的元素数量时:

int counter = 0
for( std::deque<Bstruct> it = a_deque.begin(); it != a_deque.end(); it++, counter++ );

我的计数器显示 0 个元素在

所以,我不明白为什么会出现段错误,也不明白为什么 .size() 是一个大垃圾数

-- 编辑 1 --添加调用函数的方式:

2.cpp

#include "1.h"
void fn1() {
// some code
}
A::func("abc", fn1);

它符合命令:

g++ -c -w -fpermissive -o 1.o 1.cpp
g++ -c -w -fpermissive -o 2.o 2.cpp
g++ -o final 1.o 2.o

最佳答案

通常不可能简单地在全局范围内调用函数,就像您在 2.cpp 中展示的那样.但是你提到代码是旧的,所以它可能是一个预标准的东西,或者是一个扩展。

无论如何,您已经显示在 2.cpp 中调用了该函数, 而静态数据成员 a_deque1.cpp 中定义.这意味着您可能会成为静态初始化顺序惨败的牺牲品。全局变量(例如静态数据成员,显然还有这个奇怪的独立函数调用)按照它们出现在其中的顺序进行初始化/执行一个翻译单元(= .cpp 文件),但它们在翻译单元中的顺序未指定。

这意味着 A::func() 完全有可能访问 a_dequea_deque 的构造函数之前已经运行,这很可能导致段错误(因为双端队列的内部数据成员具有零值甚至可能是随机值)。

要解决此问题,您必须以某种方式摆脱这种情况。一种选择是移动所有可以访问 a_deque 的全局代码进入1.cpp并将其放在 a_deque 的定义之后.

另一种方法是替换 a_deque带有函数作用域静态变量,保证在首次使用前初始化:

1.h

class A {
struct Bstruct {
char * b_name;
my_typedef_fn b_func;
}
static std::deque<BStruct>& a_deque();
static void func();
}

1.cpp

#include "1.h"

std::deque<A::BStruct>& A::a_deque()
{
static std::deque<BStruct> d;
return d;
}

void A::func(char * name, my_typedef_fn fn) {
a_deque().push_front((Bstruct) {name, fn} ); // <<<< hopefully no more segfault
}

关于C++ 双端队列抛出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27323571/

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