gpt4 book ai didi

c++ - 从 C 调用 C++ 函数时崩溃

转载 作者:行者123 更新时间:2023-11-30 16:35:09 31 4
gpt4 key购买 nike

我有一个 C++ 库函数,我正在从 C 函数调用它。该调用传入由 C++ 代码访问的 C 数据结构。当访问 C 数据结构时,我的程序在 C++ 代码中崩溃。我已遵循 C++ faq 中的所有说明与混合 C 到 C++ 相关。

崩溃发生在centos7机器上。在 Debug模式下运行相同的代码不会导致崩溃。在 Ubuntu (16.04) 上运行相同的代码不会导致崩溃。这是 GDB 对崩溃的分析。

(gdb) frame 5
#5 0x00007fc28e79226e in ngx_http_setup_handler (r=0x2469040)
at /opt/platform/nginx-noname-module.c:201
201 return ModProcessGetApi(r);
(gdb) p r->unparsed_uri
$1 = {len = 15, data = 0x24572c4 "/__xx/stats/all HTTP/1.1\r\nUser-Agent"}
(gdb) down
#4 0x00007fc28e7945b4 in ModProcessGetApi (r=r@entry=0x2469040)
at /opt/platform/nginx-body-handler.cc:274
274 ss_rval_t rv = ProcessGetRequest(r, data, &dsize);
(gdb) p r->unparsed_uri
$2 = {len = 38105792, data = 0xf <Address 0xf out of bounds>}
(gdb)

一旦执行进入 C++ 代码,C 数据结构就会显示地址越界。这是 C 到 C++ 函数的粘合代码。

#if __cplusplus
extern "C" {
#endif

#include <nginx.h>
#include <ngx_core.h>
#include <ngx_log.h>
#include <ngx_http.h>

ngx_int_t ModPostRequestBodyHandler(ngx_http_request_t *r);
ngx_int_t ModProcessGetApi(ngx_http_request_t* r);

#if __cplusplus
}
#endif

如果有人能阐明这一点,我将不胜感激。混合 C 和 C++ 代码时是否需要使用任何编译器选项,以便 C++ 代码可以正确访问 C 数据结构?以下是操作系统和编译器信息:

Centos 版本:发生崩溃

操作系统:Centos 7,C++:g++ 4.8.5

Ubuntu 版本:不会发生崩溃。

操作系统:Ubuntu 16.04,C++:g++ 5.4.0

不确定这是否重要,但我正在两个操作系统上的 Docker 容器中运行我的应用程序。

最佳答案

事实证明,我的 C++ 和 C 库是使用不同的 #define 进行编译的,因此,这两个库中的 C 数据结构是不同的。这会导致 C++ 端的访问不对齐。这个问题也可能发生在两个 C 库中。

感谢所有回复的人。

关于c++ - 从 C 调用 C++ 函数时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036167/

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