- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我尝试使用 abi::__cxa_demangle
来分解用户定义的类型:
#include <iostream>
#include <mutex>
#include <memory>
#include <string>
#include <typeinfo>
#include <cassert>
#include <cstdlib>
#include <cxxabi.h>
namespace
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"
#pragma clang diagnostic ignored "-Wexit-time-destructors"
std::mutex m;
std::unique_ptr< char, decltype(std::free) & > demangled_name{nullptr, std::free};
#pragma clang diagnostic pop
}
inline
std::string
get_demangled_name(char const * const symbol) noexcept
{
if (!symbol) {
return "<null>";
}
std::lock_guard< std::mutex > lock(m);
int status = -4;
demangled_name.reset(abi::__cxa_demangle(symbol, demangled_name.release(), nullptr, &status));
return ((status == 0) ? demangled_name.get() : symbol);
}
template< typename ...types >
void
f(std::size_t const i)
{
using F = void (*)();
assert(i < sizeof...(types));
static F const a[sizeof...(types)] = {static_cast< F >([] () { std::cout << get_demangled_name(typeid(types).name()) << std::endl; })...};
return a[i]();
};
struct A {};
struct B {};
struct X {};
struct Y {};
struct Z {};
int
main()
{
for (std::size_t i = 0; i < 5; ++i) {
f< A, B, X, Y, Z >(i);
}
return EXIT_SUCCESS;
}
但是 abi::__cxa_demangle
返回 status
"-3: One of the arguments is invalid."每隔一次。
在第一次调用时(对于 A
)智能指针包含 nullptr
并且 abi::__cxa_demangle
返回零 status
"0: The demangling operation succeeded." .但是文档说:
output_buffer: A region of memory, allocated with malloc, of *length bytes, into which the demangled name is stored. If output_buffer is not long enough, it is expanded using realloc. output_buffer may instead be NULL; in that case, the demangled name is placed in a region of memory allocated with malloc.
因此,我得出结论,该函数不能重复使用由其自身一致分配的内存。是错误还是我对文档的误解?
最佳答案
你误解了文档:
output_buffer: A region of memory, allocated with malloc, of *length bytes
您正在传递用 malloc
分配的内存区域,但 length
为空,因此 *length
未定义。
为了知道它是否可以重新使用内存,它需要知道 block 有多大,所以你需要传入长度作为第三个参数。
GCC 中的实现(实际上是在 libiberty support library 中):
if (output_buffer != NULL && length == NULL)
{
if (status != NULL)
*status = -3;
return NULL;
}
因此,如果您传递一个非空的 output_buffer
指针,您还必须传递一个非空的 length
指针。
因为你不知道分配的 block 有多大,你可以用当前代码做的最好的事情是使用 strlen(demangled_name.get())+1
来找到最小长度肯定是分配了。
更好的方法是保留一个存储先前大小的 size_t
全局变量,并将其传入。您可能应该将它们全部包装在一个类中,而不仅仅是一堆全局变量。
关于c++ - abi::__cxa_demangle 不能重用自己返回的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32884628/
我是 Linux 系统编程新手,在阅读时遇到了 API 和 ABILinux系统编程。 API定义: An API defines the interfaces by whichone piece o
ABI 标准中与内存布局相关的规范是否通常仅适用于 ABI 边界,或者也适用于例如在翻译单元中,或者如果不是这种情况,编译器通常会做出这样的额外保证吗? 如果“一般”太宽泛,请考虑例如带有 Syste
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
当我尝试使用调试配置在 QtCreator 中运行我的项目时,出现以下错误: 我什至不知道 ABI 是什么。我应该检查哪些设置?可能出了什么问题? 这是我的“桌面”配置: 当我将其悬停时,QtCrea
什么是 ABI,为什么 C++ 没有标准的 ABI,如果有它为什么重要? 最佳答案 ABI 是一个 Application Binary Interface .它描述了如何组织和访问应用程序二进制文件
Fatal Error: Mismatch between the program and library build versions detected. The library used 3.0
我上次在 Android Studio 中将 NDK 版本升级到最新版本后遇到了这个问题。我还找到了解决此问题的解决方案。如果有人有这个问题,我希望这是对你最好的问题和答案。请检查我的答案。 最佳答案
是否可以在没有源代码的情况下获取已知合约地址的ABI? 我发现的唯一方法是使用 etherscan 的 API,但它仅适用于经过验证的合约。 最佳答案 简单的回答:不 长答案:也许吧。 ABI 是从源
不解决 C++ 某些问题的常见解释是它会破坏 ABI 并需要重新编译,但另一方面,我遇到了这样的语句: Honestly, this is true for pretty much all C++ n
我想知道 C 头文件和 ABI 之间的关系。各种类型的大小是体系结构甚至依赖于编译器的。那么如何才能可靠地链接到 C 库呢? 对于一个更具体的问题:当使用 Haskell 的 FFI 时,甚至只使用像
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
问题: 在使用 Android Studio 时,我无法在 HTC One M7 或任何模拟器上安装我的应用程序。在升级到 5.0.2(从 4.4?)之前,它运行良好。我收到的错误消息是 INSTAL
前言:这个问题已经过时了。 在创建 Android 虚拟设备 (AVD) 时,可以选择 CPU/ABI。我已经尝试了所有可用的目标——除了 ARM 别无选择。我的目标是 Android 3.2。 我假
标题说明了一切。我将向具有默认值的类的成员函数添加一个参数。该参数属于非平凡类型。这会破坏 ABI 吗?假设我的新库版本将是 M.m.0,它应该可以作为所有使用 M.m-1.x 的链接应用程序的直接替
我有一个配置探测器,它根据平台和版本确定要传递给 g++ 的标志。我通常使用比 native 安装版本更高版本的 gcc,以便访问 C++14 功能。在较旧的平台上,这意味着我需要添加 -D_GLIB
我看到很多关于 C++ 没有标准 ABI 的讨论,就像 C 一样。我很好奇究竟是什么问题。到目前为止,我想出了 名称修改 异常处理 RTTI 还有其他与 C++ 相关的 ABI 问题吗? 最佳答案 在
我正在使用 ethers-rs 编写一个 defi 应用程序。我需要计算 Rust 中的 CREATE2 地址。我在 Rust 中找不到与 abi.encodePacked(token0, token
尝试使用此 setup.py 从空项目创建轮子: 设置.py from setuptools import setup setup(name='bla', version='1') 我调用 pytho
使用 Android Gradle Experimental 插件版本 0.9.1。我需要为每个 ABI 设置不同的静态库搜索路径,有什么方法可以实现吗? 这里是 build.gradle fragm
假设我们有一个接受或返回某种标准类的共享库: //lib.h #include std::vector returnSomeInts(); //lib.cpp #include "lib.cpp"
我是一名优秀的程序员,十分优秀!