2016-08-16 59 views
0

即时通讯在模块化程序上使用dlopen,我认为有些事情真的是错误的,但我似乎无法弄清楚。dlopen之后错误的字符串库?

requirementData是一个名为VoidData的类的向量。它仅仅是一个类来处理void *容易

getCopyOfData()使用memcpy来复制存储在void *中的数据。直到此处为止,地址voidptr与存储在我的VoidData对象中的地址不同,因此副本是成功的。

现在... stringA给了我正确的字符串。这对stringB也是可以的。但后来stringC,他给了我一些奇怪的东西。

void* voidptr = requirementData[0].getCopyOfData(); 

string stringA = *((string*) voidptr); 
cout << "VoidPtr: " << stringA << endl; // VoidPtr: 'SayHey' 

string stringB = *((string*) voidptr); 
cout << "VoidPtr: " << stringB << endl; // VoidPtr: 'SayHey' 

// load library 
void *handle = dlopen("/usr/lib64/libOpcWorkingPackage.so", RTLD_LAZY); 

string stringC = *((string*) voidptr); 
cout << "VoidPtr: " << stringC << endl; // VoidPtr: '����' 

我也试图投voidptr到uint8_t的阵列。每次数组给我相同的32个数字。

for (unsigned int i = 0; i < sizeof(stringC); i++){ 
    cout << to_string(((uint8_t*) voidptr)[i]) << ", "; 
} 
cout << endl; 
// 80, 181, 228, 245, 255, 127, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 83, 97, 121, 101, 119, 121, 0, 0, 0, 183, 228, 245, 255, 127, 49, 52 

我出来的想法,也许有人可以帮助我。

感谢,Narase

编辑:这是我的getCopyOfData()函数:

void* VoidData::getCopyOfData() const { 
    void *data = malloc(size); 
    memcpy(data, storedData, size); 
    return data; 
} 

编辑:知道了

我得到的数据是一个char []。这个char []放在一个不会复制它们的字符串中,它只是在它上面放一个指针。在char []释放后,字符串将一直工作,直到之后使用的内存已被使用为止

谢谢您的正确想法user4581301!

+1

需要查看'getCopyOfData'。很可能它正在返回一个指向局部变量的指针。 – user4581301

+0

我在上面编辑过 – Narase

+0

尽管我不确定这是否是您的问题,但代码中存在代码异味,因为所有字符串stringA,stringB和stringC将在超出作用域时释放voidptr。它可能是编译器在调用dlopen之前向stringA/stringB的析构函数插入一个调用,以便在最终调用cout voidptr时释放(两次),并且打印出释放的内存。 –

回答

0

我得到的数据是在char []中。这个char []放在一个字符串中(我),它不会复制它们,它只是在它上面放一个指针。在释放char []后,该字符串将一直运行,直到之后使用的内存已被使用。

感谢您的正确想法user4581301!