【发布时间】:2022-01-12 18:30:46
【问题描述】:
我有一个共享库 mod.so,它有一个函数 getptr 来返回指向动态分配的内存的指针。它还有一个函数 Unload,它释放分配的内存。 主程序在运行时加载这个共享库,并从 getptr 获取指针 函数,但是当调用 Unload 函数时,它给了我分段错误。
main.cpp
#include <iostream>
#include <dlfcn.h>
using namespace std;
int main()
{
void* module = dlopen("mod.so",RTLD_LAZY);
typedef int*(*func)();
typedef void(*func1)();
func f = (func)dlsym(module,"getptr");
func1 b = (func1)dlsym(module,"Unload");
int* p = f();
b();
}
mod.cpp
#include <iostream>
#include <vector>
using namespace std;
vector<int*> allocated;
extern "C"
{
int* getptr()
{
int* p = new int;
*p = 1024;
allocated.push_back(p);
return p;
}
void Unload()
{
for(auto e: allocated)
delete e;
}
}
mod.cpp 编译为:
g++ -shared mod.cpp -o mod.so -fPIC
【问题讨论】:
-
int* Unload()-- 当您应该返回int*时,您没有返回值 -- 未定义的行为。另外,你的编译器应该已经警告过你了。 -
不,这不是程序崩溃的问题,即使我使用 void Unload()
-
这是否能解决您的问题无关紧要——代码错误,如果不进行更改,您将无法更进一步。
-
在
Unload()中,您不调用allocated.clear()。如果你多次使用Unload()并由getptr()交错,你可能会得到双释放(或空解引用)错误,除非你去掉你调用delete的指针。如果你不多次使用Unload(),那为什么这段代码不在析构函数中呢?为什么要使用原始指针?vector<unique_ptr<int>> allocated; ...; allocated.push_back(make_unique<int>(1024))怎么样?这会自动处理您的释放。为什么要手动分配ints?为什么不vector<int> v; ...; return &v.emplace_back(1024);? -
在资源及其分配方面,以pairs 的形式创建函数始终是一个不错的设计选择:一个用于创建或分配,一个用于销毁或释放。跨度>
标签: c++ crash segmentation-fault shared-libraries shared-memory