c++ - 访问向量的段错误共享库中填充的对象
问题描述
我创建了一个共享库,它只是用来自 c++ 程序的一些硬编码值填充传递的对象。
在访问作为向量的对象数据成员时,我遇到了分段错误,如果我不访问该元素,当对象被破坏时,我仍然会遇到分段错误。
让我知道是否需要与 g++ 构建版本或共享库构建版本相关的任何其他信息来缩小问题范围。
添加更多信息我有两台机器都是ubuntu
此代码适用于机器 1
temp@ubuntu:~/c++$ uname -a
Linux ubuntu 4.4.0-186-generic #216-Ubuntu SMP Wed Jul 1 05:34:05 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
temp@ubuntu:~/c++$ ./a.out
10.15.29.40
10.15.29.41
10.15.29.51
hostname4
temp@ubuntu:~/c++$
机器 2 在这台机器上不起作用的地方
temp@ubuntu16:~$ uname -a
Linux ubuntu16 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
temp@ubuntu16:~$ g++ -v
and the output I have mentione of a.out below
共享库代码
#include <filter.h> // has decleration of class Filter
#ifdef __cplusplus
extern "C" {
#endif
int GetFilter(const char* appCtx, Filter& filter)
{
int error = -1;
int success = 0;
filter.a= 10;
filter.b= 1;
filter.c= 13;
filter.d= 524319;
filter.hostnames.push_back("10.15.29.40");
filter.hostnames.push_back("10.15.29.41");
filter.hostnames.push_back("10.15.29.51");
filter.hostnames.push_back("hostname4");
return success;
}
#ifdef __cplusplus
}
#endif
C++ 程序
#include <iostream>
#include <vector>
#include <string>
#include <stdint.h>
using namespace std;
// instead of declearing class here filter.h can also be added
class Filter{
public:
vector<string> hostnames;
uint32_t a;
uint64_t b;
uint64_t c;
uint64_t d;
};
extern "C" {
int GetFilter(const char* name, Filter& filter);
}
int main() {
Filter temp;
GetFilter("arya" , temp);
cout<<temp.hostnames.size()<<endl;
for(int i=0;i<temp.hostnames.size();++i){
cout<<temp.hostnames[i]<<endl;
}
return 0;
}
./a.out 输出
1 /// <<--- how come size is one??
10.15.29.40!@⚌⚌⚌{W> 0
10.15.29.41!⚌{W>⚌⚌ 0
10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1 hostname410.15.29.40!@⚌⚌⚌{W> 0
10.15.29.41!⚌{W>⚌⚌ 0
10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1 hostname410.15.29.40!@⚌⚌⚌{W> 0
10.15.29.41!⚌{W>⚌⚌ 0
10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1 hostname410.15.29.40!@⚌⚌⚌{W> 0
10.15.29.41!⚌{W>⚌⚌ 0
10.15.29.511⚌⚌8⚌⚌⚌⚌⚌⚌⚌1 hostname410.15.29.40!@⚌⚌⚌{W> 0
10.15.29.41!⚌{W>⚌⚌ 0
10.15.29.511⚌*** Error in `./a.out': free(): invalid pointer: 0x0000000000de9de8 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777f5)[0x7f5d3e22a7f5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8038a)[0x7f5d3e23338a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f5d3e23758c]
./a.out[0x4010f1]
./a.out[0x401091]
./a.out[0x40100a]
./a.out[0x400f55]
./a.out[0x400e00]
./a.out[0x400daa]
./a.out[0x400cea]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f5d3e1d3840]
./a.out[0x400b59]
======= Memory map: ========
00400000-00402000 r-xp 00000000 fc:00 272871 /home/virsec/aryaman/a.out
00601000-00602000 r--p 00001000 fc:00 272871 /home/virsec/aryaman/a.out
00602000-00603000 rw-p 00002000 fc:00 272871 /home/virsec/aryaman/a.out
00dd8000-00e0a000 rw-p 00000000 00:00 0 [heap]
7f5d38000000-7f5d38021000 rw-p 00000000 00:00 0
7f5d38021000-7f5d3c000000 ---p 00000000 00:00 0
7f5d3deaa000-7f5d3dfb2000 r-xp 00000000 fc:00 2753021 /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3dfb2000-7f5d3e1b1000 ---p 00108000 fc:00 2753021 /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3e1b1000-7f5d3e1b2000 r--p 00107000 fc:00 2753021 /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3e1b2000-7f5d3e1b3000 rw-p 00108000 fc:00 2753021 /lib/x86_64-linux-gnu/libm-2.23.so
7f5d3e1b3000-7f5d3e373000 r-xp 00000000 fc:00 2752999 /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e373000-7f5d3e573000 ---p 001c0000 fc:00 2752999 /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e573000-7f5d3e577000 r--p 001c0000 fc:00 2752999 /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e577000-7f5d3e579000 rw-p 001c4000 fc:00 2752999 /lib/x86_64-linux-gnu/libc-2.23.so
7f5d3e579000-7f5d3e57d000 rw-p 00000000 00:00 0
7f5d3e57d000-7f5d3e593000 r-xp 00000000 fc:00 2753039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5d3e593000-7f5d3e792000 ---p 00016000 fc:00 2753039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5d3e792000-7f5d3e793000 rw-p 00015000 fc:00 2753039 /lib/x86_64-linux-gnu/libgcc_s.so.1
7f5d3e793000-7f5d3e905000 r-xp 00000000 fc:00 1572889 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3e905000-7f5d3eb05000 ---p 00172000 fc:00 1572889 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3eb05000-7f5d3eb0f000 r--p 00172000 fc:00 1572889 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3eb0f000-7f5d3eb11000 rw-p 0017c000 fc:00 1572889 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f5d3eb11000-7f5d3eb15000 rw-p 00000000 00:00 0
7f5d3eb15000-7f5d3eb2a000 r-xp 00000000 fc:00 2753533 /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3eb2a000-7f5d3ed29000 ---p 00015000 fc:00 2753533 /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3ed29000-7f5d3ed2a000 r--p 00014000 fc:00 2753533 /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3ed2a000-7f5d3ed2b000 rw-p 00015000 fc:00 2753533 /usr/local/openresty/nginx/libIAE-Assist.so
7f5d3ed2b000-7f5d3ed51000 r-xp 00000000 fc:00 2753071 /lib/x86_64-linux-gnu/ld-2.23.so
7f5d3ef42000-7f5d3ef48000 rw-p 00000000 00:00 0
7f5d3ef4f000-7f5d3ef50000 rw-p 00000000 00:00 0
7f5d3ef50000-7f5d3ef51000 r--p 00025000 fc:00 2753071 /lib/x86_64-linux-gnu/ld-2.23.so
7f5d3ef51000-7f5d3ef52000 rw-p 00026000 fc:00 2753071 /lib/x86_64-linux-gnu/ld-2.23.so
7f5d3ef52000-7f5d3ef53000 rw-p 00000000 00:00 0
7ffe6034f000-7ffe60370000 rw-p 00000000 00:00 0 [stack]
7ffe603c5000-7ffe603c8000 r--p 00000000 00:00 0 [vvar]
7ffe603c8000-7ffe603ca000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
解决方案
推荐阅读
- java - 使用库时出现 ClassNotFoundException 异常
- excel - SSIS 脚本任务 - 使用只读变量名称保存 Excel 模板的副本
- python-3.x - pandas groupby 并根据值填充列
- point-cloud-library - 如何获得 PCL 中带有噪声点的估计正态的正态和协方差?
- sql-server - 数据库不断进入恢复挂起状态
- angular - IONIC - HTTP Post 请求不起作用,可能是标头问题
- java - Kotlin:就地保留、替换或删除每个地图条目
- android - Android混淆不会更改包名称
- excel - 在 EXCEL 中创建运行状态跟踪器
- c - 从 C 向 GenServer 发送消息