分段故障(核心转储)-不知道为什么
Segmentation fault (core dumped) - dont know why
我正在学习C++的路上。我正在尝试在运行时链接库。我得到一个分段错误。我不知道为什么会这样。以下是发生错误的cpp文件:
#include "CreateShape.h"
#include <dlfcn.h>
#include <iostream>
#include <sstream>
#include "Shape.h"
namespace six
{
typedef six::Shape* (*GET_OBJECT);
Shape* create_shape(const char* name)
{
Shape* shape = nullptr;
std::stringstream libName;
libName << "./lib" << name << ".so";
void* handle = dlopen(libName.str().c_str(), RTLD_LAZY);
if(handle == nullptr)
{
std::cout << "Could not open the library" << std::endl;
std::cout << "dlerror: "<< std::endl << dlerror() << std::endl;
exit(EXIT_FAILURE);
}
GET_OBJECT createShape = reinterpret_cast<GET_OBJECT>(dlsym(handle, "getNewShape"));
if(createShape == nullptr)
{
std::cout << "Could not find symbol getNewShape" << std::endl;
std::cout << "dlerror=" << dlerror() << std::endl;
dlclose(handle);
exit(EXIT_FAILURE);
}
return create_shape(name);
}
}
功能的精简版本是
Shape* create_shape(const char* name)
{
if(some_condition)
{
exit(EXIT_FAILURE);
}
if(some_other_condition)
{
exit(EXIT_FAILURE);
}
return create_shape(name);
}
您可能想要返回shape
或在该函数中创建的某些Shape
。相反,您所做的是递归地调用函数。停止递归的唯一方法是满足其中一个条件,然后调用exit
。
不过,我不得不承认,为什么这种症状是一个我真的不明白的错误。
您没有以正确的方式使用dl调用。从linux dlopen(3(手册页
dlsym((
[…]由于符号的值实际上可能是NULL(因此
dlsym()
的NULL返回不需要指示错误(,测试错误的正确方法是调用dlerror()
以清除任何旧的错误条件,然后调用dlsym()
,然后再次调用dlerror()
,将其返回值保存到变量中,并检查保存的值是否不是NULL。
相关文章:
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 我不知道为什么这段代码会让核心被转储?
- 反转字符串.不知道为什么这个逻辑是错误的.C++
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- if-else 语句仅按特定顺序工作,我不知道为什么
- DirectX 11 引擎在第三次代码改进后没有突然运行,我不知道为什么
- 函数抛出seg错误,我不知道为什么
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- 随着时间的推移,我的程序越来越慢,我不知道为什么.内存泄漏
- 分段故障(核心转储)-不知道为什么
- "错误:在'.标记'之前出现预期的主表达式,我不知道为什么
- 我正在制作c ++代码,但发生错误我不知道为什么
- std::cout << glGetString(GL_RENDER) << std::endl;抛出错误但不GL_Renderer或GL_Verision,我不知道为什么?
- 不知道为什么它不会停止循环
- 我的Arduino串行命令行不起作用,我不知道为什么
- 我正在编写一个拆分为 3 的合并排序,我不知道为什么它不起作用
- C++单例模式代码无法运行,不知道为什么?
- 我不知道为什么我的矢量无法推回
- 罗马数字输出C++总是"-858993460",不知道为什么?
- 合成错误不知道为什么会发生这种情况,请检查一下并告诉我这是我的编码还是视觉工作室