gpt4 book ai didi

c++ - 为什么 gcc 4.7.0 在这段代码上给我一个段错误,而在线 ideone(gcc 4.5.1) 却没有?

转载 作者:搜寻专家 更新时间:2023-10-31 00:19:09 24 4
gpt4 key购买 nike

我有以下代码(仅适用于 gcc):

#include <iostream>
#include <cstdlib>
#include <string>
#include <typeinfo>
#include <cxxabi.h>

const std::string demangle (const char* name) {

int status = -4;
char* res = abi::__cxa_demangle(name, 0, 0, &status);
const char* const demangled_name = (status == 0) ? res : name;
std::string ret_val(demangled_name);
std::free(res);

return ret_val;
}

template <typename T>
const std::string getname (T x)
{
return demangle(typeid(x).name());
}

int main()
{
std::add_const<int>::type *p = static_cast<const int *>(0);
std::cout << getname(*p) << std::endl;
}

在我的本地计算机上(使用 gcc 4.7.0(实验版)它会崩溃(使用 gdb 运行会出现段错误)。但是,对于 ideone.com,它会按预期打印“int”。继承人,a link to the example。另外,摆脱模板并调用 demangle(typeid(x).name()) 直接解决了问题,那么模板有什么问题呢?

编辑我忘记包含解决问题的 type_traits header (doh!),但我仍然想更好地了解发生了什么。

最佳答案

std::add_const<int>::type *p = static_cast<const int *>(0); 

p 是一个空指针,取消引用它(即 *p)会调用给出未定义的行为 (UB)。你很幸运它给出了段错误。因为它是实际上 UB,所以所有编译器(和所有版本)可能不会给出段错误,因为这就是 UB 的意思,即任何事情都可能发生。

你为什么不试试这个:

std::cout << getname(int()) << std::endl;

关于c++ - 为什么 gcc 4.7.0 在这段代码上给我一个段错误,而在线 ideone(gcc 4.5.1) 却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8921061/

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